oracle 如何识别数据库中的模式(其结构/元数据)是否已更改

nbysray5  于 2023-01-25  发布在  Oracle
关注(0)|答案(1)|浏览(131)

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

50pmv0ei

50pmv0ei1#

如果您只需要知道谁在什么时候做了什么,请使用数据库审计。
如果您只需要知道某个 * 可能 * 已经更改的内容,但不关心是什么,并且可以接受更改并不重要的可能性,则可以使用dba_objects中的last_ddl_time,并将其与上次检查中获得的最大值进行比较。
如果您确实需要生成增量并确定某些内容发生了更改,则有两种选择:
1.针对所有应用程序字典视图构建数据字典查询(工作量很大,因为有很多视图-列、表、分区、子分区、索引、索引分区、索引子分区、大对象、大对象分区等)
1.(推荐)使用dbms_metadata提取整个方案的DDL。请参见this answer,该查询将导出您可能关心的几乎所有对象。
使用#1或#2,您可以比较旧/新字符串或使用散列函数(例如dbms_crypto.hash)来计算散列值并进行比较。我编写了一个模式升级工具,它可以准确地执行此操作--外科手术式地识别并升级与某个模板源模式不同的单个对象。我使用dbms_metadata来查找散列值的差异。但是,我需要设置某些转换来省略你不关心的子句,这些子句可能会有任意的变化,或者在事实发生后用regexp_replace屏蔽它们(例如,一个序列将包含总是不同的当前值...你不希望看到这是一个变化)。这可能会有点工作量。

相关问题