如何识别数据库中的模式(其结构/元数据)是否发生了变化



我需要确定数据库中的模式是否在元数据中有任何更改,例如更改表列或更改过程/包PL/sql代码附加/删除触发器等。我尝试用content=metadata_only制作expdp,并计算了转储的校验和。但这不起作用,因为尽管相同的数据库未更改,但每次校验和都会更改。如何识别数据库中的模式(其结构)是否发生了变化?我必须导出纯文本元数据吗?Thx .

如果您只需要知道谁在什么时候做了什么,请使用数据库审计。

如果您只需要知道可能已更改的内容,但不关心更改是什么,并且可以接受更改不显著的可能性,则可以使用dba_objects中的last_ddl_time并将其与上次检查中获得的最后最大值进行比较。这可以在模式级或对象级完成。

如果你真的需要生成一个增量,并确定某些东西发生了变化,你有两个选择:

  1. 针对所有应用程序字典视图构建数据字典查询(大量工作,因为有很多视图-列,表,分区,子分区,索引,索引分区,索引子分区,lob, lob分区,等等,等等)

  2. (推荐)使用dbms_metadata提取整个模式的DDL。查看这个查询的答案,它将导出几乎所有您可能关心的对象。

无论使用#1或#2,您都可以比较旧/新字符串或使用哈希函数(例如dbms_encrypt .hash)来计算哈希值并进行比较。我编写了一个模式升级工具,它就是这样做的——精确地识别和升级与模板源模式不同的单个对象。我使用dbms_metadata来查找散列值上的差异。然而,你需要设置某些转换来忽略你不关心的子句,这些子句可能会有任意的变化,或者在事实之后用regexp_replace掩盖它们(例如,序列将包含始终不同的当前值)。你不希望看到这是一个变化)。这可以是一点工作。

最新更新