シノニムとはオブジェクト(テーブル、view、プロシージャなど)につけた別名の事です。活用例としては、別スキーマが持っているオブジェクトを利用する際、通常はスキーマ名.オブジェクト名として利用するところシノニムを利用する事でスキーマ修飾を省略する事ができます。その他実用的な使い方として、アプリケーションが利用しているテーブルをシノニム経由にして置くことで、アプリケーションに意識させる事なく実体テーブルを「すげかえる」ような事もできます。(当然レイアウトは同じでないといけませんが)
シノニムの作成
-- 通常はスキーマ修飾をしてアクセス
select * from sooni.ex02
;
-- シノニムを作成
create or replace synonym ex02 for sooni.ex02
;
-- シノニム名を使うとスキーマ修飾が不要となります
select * from ex02
;
ここで注意点があります。シノニムで指定する実体(上記例だとsooni.ex02)が「存在しない」場合でもsynonymの作成はエラーなく完了します。ただし実際にそのシノニムを使いアクセスしたタイミングでエラー(ORA-00980: シノニム変換が無効です。)が発生します。
シノニムの確認
シノニムはDBA_SYNONYMSを参照する事で確認できます。シノニムもオブジェクトなのでDBA_OBJECTSと結合できて作成日やステータスの確認もできます。結合条件で、OBJECT_TYPE != ‘PACKAGE BODY’としているのは、DBA_OBJECTSディクショナリはパッケージ仕様部とボディー部で2レコード保持するためです。
select s.OWNER,s.SYNONYM_NAME ,o.OBJECT_TYPE,o.CREATED,o.LAST_DDL_TIME,o.STATUS ,s.TABLE_OWNER,s.TABLE_NAME ,c.OBJECT_TYPE from dba_synonyms s inner join dba_objects o on s.OWNER = o.OWNER and s.SYNONYM_NAME = o.OBJECT_NAME left outer join dba_objects c -- 実体テーブルが存在しない場合も考慮して外部結合 on s.TABLE_OWNER = c.OWNER and s.TABLE_NAME = c.OBJECT_NAME and c.OBJECT_TYPE != 'PACKAGE BODY' where s.OWNER = 'SCOTT' order by o.CREATED desc ;
上記赤丸のように、ステータスがINVALIDになる場合があります。(シノニム作成後に、実体テーブルを削除したあと同じテーブルをcreateしたとしてもinvalidのステータスは変わりません)こんな時は以下コンパイルをすると解消します。
シノニムのコンパイル
alter synonym ex02 compile ;
INVALIDになっているシノニムのコンパイルSQLを出力
テーブルの再作成などを行いINVALIDが大量に発生した場合などは以下が便利です
select 'ALTER'||' SYNONYM '||o.OWNER||'.'||o.OBJECT_NAME||' COMPILE '||';' COMPILE_SQL from dba_objects o where o.OWNER = 'SOONI' and o.OBJECT_TYPE in ('SYNONYM') and o.STATUS ='INVALID' order by o.OBJECT_NAME,o.OBJECT_TYPE ;