スキーマ間の差分チェックSQL
SELECT * FROM
(SELECT 'NonExistence_in_schemaA' df, b.*
FROM (SELECT TABLE_NAME tb, COLUMN_NAME cl, DATA_TYPE tp, DATA_LENGTH ln
FROM ALL_TAB_COLUMNS
WHERE OWNER = '&&schema_A') a,
(SELECT TABLE_NAME tb, COLUMN_NAME cl, DATA_TYPE tp, DATA_LENGTH ln
FROM ALL_TAB_COLUMNS
WHERE OWNER = '&&schema_B') b
WHERE a.tb(+) = b.tb
AND a.cl(+) = b.cl
AND a.cl IS NULL
UNION ALL
SELECT 'NonExistence_in_schemaB' df, a.*
FROM (SELECT TABLE_NAME tb, COLUMN_NAME cl, DATA_TYPE tp, DATA_LENGTH ln
FROM ALL_TAB_COLUMNS
WHERE OWNER = '&&schema_A') a,
(SELECT TABLE_NAME tb, COLUMN_NAME cl, DATA_TYPE tp, DATA_LENGTH ln
FROM ALL_TAB_COLUMNS
WHERE OWNER = '&&schema_B') b
WHERE a.tb = b.tb(+)
AND a.cl = b.cl(+)
AND b.cl IS NULL
UNION ALL
SELECT 'Disagreement_of_type_or_length' df, a.*
FROM (SELECT TABLE_NAME tb, COLUMN_NAME cl, DATA_TYPE tp, DATA_LENGTH ln
FROM ALL_TAB_COLUMNS
WHERE OWNER = '&&schema_A') a,
(SELECT TABLE_NAME tb, COLUMN_NAME cl, DATA_TYPE tp, DATA_LENGTH ln
FROM ALL_TAB_COLUMNS
WHERE OWNER = '&&schema_B') b
WHERE a.tb = b.tb
AND a.cl = b.cl
AND NOT (a.tp = b.tp AND a.ln = b.ln)
)
ORDER BY df, tb, cl
/
使用法
上記の SQL を実行すると、schemaA 及び schemaB の入力を求められるので、比較したい2つのスキーマ名を入力して下さい。
双方のスキーマにアクセス権限のあるユーザでログインした上で実行する必要があります。
スキーマBにはあるがスキーマAには存在していないテーブル・カラム ( NonExistence_in_schemaA )
スキーマAにはあるがスキーマBには存在していないテーブル・カラム ( NonExistence_in_schemaB )
スキーマAとスキーマBの両方に存在するが、項目のデータ型やサイズが異なるテーブル・カラム ( Disagreement_of_type_or_length )
以上の3種の「差分」が結果として出力されます。3種のどれに当たるかは項目 df に出力されます。
ご意見・ご指摘等ございましたらお願い致します。(雑記帳へ)