如何检查两个表是否与Oracle中的对象相同

时间:2018-09-25 20:59:30

标签: oracle oracle12c database-administration

如何检查两个表作为对象在Oracle中是否相同?

我需要检查以下两个表的要点。

  1. 表中的列数相同,名称,数据类型和列长相同。
  2. 两个表的列约束数量相同。
  3. 两个表都具有相同数量的索引和授予。

两个表都存在于同一模式中。

1 个答案:

答案 0 :(得分:1)

您必须查询元数据的一种或另一种方式。您可以

  • 从user_tables / user_indexes / etc中选择

  • 使用dbms_metadata。(get_ddl | get_dependent_ddl | get_granted_ddl | etc)并比较文本(如果是get_xml等,则比较XML)。您可能想通过使用dbms_metadata.set_transform_param将SEGMENT_ATTRIBUTES等许多参数设置为false来生成元数据时省略很多细节。

另一个复杂性是分区表。您是否需要它们具有完全相同的分区才能“相同”?

即使在非常简单的情况下,也可能会有细微的细节。例如,您是否认为下面两个表“相同”?

create table t1 (id int, name varchar2(30), col int constraint chk_col check (col is not null));
create table t2 (id int, name varchar2(30), col int not null);

列元数据不同

SQL> select table_name, column_name, nullable
  2  from user_tab_columns
  3  where table_name in ('T1','T2');

TABLE_NAME COLUMN_NAM NULLABLE
---------- ---------- ----------
T1         ID         Y
T1         NAME       Y
T1         COL        Y
T2         ID         Y
T2         NAME       Y
T2         COL        N

6 rows selected.

因此,请尝试使此对帐工具尽可能简单。它可能具有3个输出,例如相同/不同/“需要手动比较”,因此您无需检查脚本中的每个细节。

PS。诸如Allround Automations PL / SQL开发人员之类的一些开发工具具有使用UI比较元数据的工具。