Так или иначе, вы должны запрашивать метаданные.Вы можете либо
- выбрать из user_tables / user_indexes / etc
, либо
- использовать dbms_metadata. (Get_ddl | get_dependent_ddl | get_granted_ddl | и т. Д.)и сравните текст (или XML в случае get_xml и т. д.).Возможно, вы захотите пропустить много деталей при генерации метаданных, установив для многих параметров, таких как SEGMENT_ATTRIBUTES, значение false, используя dbms_metadata.set_transform_param.
Другая сложность - это секционированные таблицы.Вам нужно, чтобы у них были одинаковые разделы, чтобы они были «идентичны»?
Даже в очень простых случаях могут быть тонкие детали.Например, считаете ли вы две таблицы "идентичными"?
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 developer, имеют инструменты для сравнения метаданных с использованием пользовательского интерфейса.