スキーマ(ユーザ)同士の定義比較
開発と本番でスキーマが分かれていてテーブル定義に差異が出てしまうことって時たまあるとおもいます。
で、その差異を洗うにはこんな感じの一発で差異がとれたりします。
たとえば
current_schema
history_schema
っていう2つのスキーマがあって
current_schemaには
TABLE_A(ID,NAME)
history_schemaには
TABLE_A(ID,NAME,DIV),TABLE_B(ID,NAME)
があったとき
まずテーブル名の差異は
SELECT TABLE_NAME ,'CURRENT' FROM ALL_TABLES WHERE OWNER = 'CURRENT_SCHEMA' MINUS SELECT TABLE_NAME ,'CURRENT' FROM ALL_TABLES WHERE OWNER = 'HISTORY_SCHEMA' UNION ALL SELECT TABLE_NAME ,'HISTORY' FROM ALL_TABLES WHERE OWNER = 'HISTORY_SCHEMA' MINUS SELECT TABLE_NAME ,'HISTORY' FROM ALL_TABLES WHERE OWNER = 'CURRENT_SCHEMA'
でとれます。
上記のsqlでは、current_schemaにしかないテーブルは2カラム目にCURRENT,history_schemaにしかないテーブルは2カラム目にHISTORYで結果が帰ってきます。
さらにカラムまでチェックしたい場合は
SELECT TABLE_NAME ,COLUMN_NAME ,'CURRENT' FROM ALL_TAB_COLUMNS WHERE OWNER = 'CURRENT_SCHEMA' MINUS SELECT TABLE_NAME ,COLUMN_NAME ,'CURRENT' FROM ALL_TAB_COLUMNS WHERE OWNER = 'HISTORY_SCHEMA' UNION ALL SELECT TABLE_NAME ,COLUMN_NAME ,'HISTORY' FROM ALL_TAB_COLUMNS WHERE OWNER = 'HISTORY_SCHEMA' MINUS SELECT TABLE_NAME ,COLUMN_NAME ,'HISTORY' FROM ALL_TAB_COLUMNS WHERE OWNER = 'CURRENT_SCHEMA'
な感じでcurrentとhistoryのカラム名の比較ができます。
さらに、型や桁数などまで見たければ、ALL_TAB_COLUMNS.DATA_TYPE,DATA_LENGTHまで比較対象に加えればokです。
ここまでで ALL_TABLES とか ALL_TAB_COLUMNSとかあまり使わないテーブル名が出てきたかと思いますが
これはORACLEのデータディクショナリビューといいます。
Oracleのオンラインドキュメントだといろんなとこに書かれていて見にくいので
下記のサイトなんかおすすめです。
http://luna.gonna.jp/oracle/ora_ddv.html
※ただし、SYSTEM権限のあるユーザでログインする必要がありますが、、、、