スキーマ間の差分チェック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 に出力されます。

ご意見・ご指摘等ございましたらお願い致します。(雑記帳へ
ホームページへ戻る