「このシノニムはどのテーブルを指しているのか」「パブリックシノニムの一覧を出したい」「無効なシノニムを特定したい」――Oracleのシノニム管理は、スキーマをまたぐオブジェクト参照が多い実務環境でよく発生します。
この記事では、USER_SYNONYMS・ALL_SYNONYMS・DBA_SYNONYMSの使い分けから、参照先の確認、無効なシノニムの特定、CREATE/DROP SYNONYM まで体系的に解説します。
この記事で学べること
- シノニムとは何か・プライベートとパブリックの違い
- USER_SYNONYMS / ALL_SYNONYMS / DBA_SYNONYMS の使い分け
- スキーマ名・シノニム名・参照先テーブルで絞り込むクエリ
- パブリックシノニムの一覧確認
- シノニムの参照先(DB_LINK含む)を確認する方法
- 無効(INVALID)なシノニムを特定する方法
- シノニムの作成(CREATE SYNONYM)と削除(DROP SYNONYM)
Oracleシノニムとは
シノニム(SYNONYM)は、テーブル・ビュー・ストアドプロシージャ・ファンクション・シーケンスなど、データベースオブジェクトに対する別名(エイリアス)です。長いオブジェクト名を短くしたり、スキーマ名を隠して透過的にアクセスできるようにするために使われます。
| 種類 |
アクセス範囲 |
OWNER値 |
作成権限 |
| プライベートシノニム |
作成したスキーマのみ |
スキーマ名 |
CREATE SYNONYM権限 |
| パブリックシノニム |
全ユーザー共通 |
PUBLIC |
CREATE PUBLIC SYNONYM権限(DBA等) |
よくある使い方:別スキーマのテーブルに SCOTT.EMP ではなく EMP だけでアクセスできるようにシノニムを作成する。OracleのシステムオブジェクトもDUALなどパブリックシノニム経由で参照されています。
シノニム確認ビューの使い分け
| ビュー |
表示範囲 |
必要な権限 |
USER_SYNONYMS |
自スキーマが所有するシノニムのみ |
不要(自スキーマ) |
ALL_SYNONYMS |
自スキーマが参照可能なシノニム+パブリック |
不要(アクセス権限内) |
DBA_SYNONYMS |
DB全体のすべてのシノニム |
SELECT ANY DICTIONARY または DBAロール |
各ビューの主要な列
| 列名 |
内容 |
例 |
OWNER |
シノニムの所有者スキーマ名 |
SCOTT, PUBLIC |
SYNONYM_NAME |
シノニム名 |
EMP, DUAL |
TABLE_OWNER |
参照先オブジェクトの所有スキーマ名 |
HR, SYS |
TABLE_NAME |
参照先オブジェクト名 |
EMPLOYEES, DUAL |
DB_LINK |
リモートDB参照の場合のDBリンク名(NULLなら同一DB内) |
PROD_LINK, NULL |
シノニムを確認するクエリパターン
自スキーマのシノニム一覧
SQL – 自スキーマのシノニム一覧
SELECT synonym_name, table_owner, table_name, db_linkFROM user_synonymsORDER BY synonym_name;
特定スキーマのシノニムを確認する
SQL – スキーマ指定で絞り込み
SELECT owner, synonym_name, table_owner, table_name, db_linkFROM dba_synonymsWHERE owner = 'SCOTT' -- 大文字で指定ORDER BY synonym_name;
シノニム名で検索する
SQL – シノニム名で検索(LIKE対応)
-- 完全一致SELECT owner, synonym_name, table_owner, table_nameFROM dba_synonymsWHERE synonym_name = 'EMP';-- 前方一致(EMP で始まるシノニムを検索)SELECT owner, synonym_name, table_owner, table_nameFROM dba_synonymsWHERE synonym_name LIKE 'EMP%'ORDER BY owner, synonym_name;
参照先テーブル名でシノニムを検索する
「このテーブルに対してシノニムが存在するか」を逆引きで確認できます。
SQL – 参照先テーブルからシノニムを逆引き
SELECT owner AS synonym_owner, synonym_name, table_owner, table_name, db_linkFROM dba_synonymsWHERE table_name = 'EMPLOYEES' AND table_owner = 'HR'ORDER BY owner, synonym_name;
パブリックシノニムを確認する
パブリックシノニムは OWNER = 'PUBLIC' で絞り込みます。DUALやオラクル提供のシステムオブジェクトもパブリックシノニムとして登録されています。
SQL – パブリックシノニムの確認
-- パブリックシノニム一覧(ユーザー定義のもの)SELECT synonym_name, table_owner, table_name, db_linkFROM dba_synonymsWHERE owner = 'PUBLIC' AND table_owner NOT IN ('SYS', 'SYSTEM')ORDER BY synonym_name;-- 特定のシノニム名のパブリックシノニムを検索SELECT synonym_name, table_owner, table_nameFROM all_synonymsWHERE owner = 'PUBLIC' AND synonym_name = 'DUAL';
DBリンク経由のシノニムを確認する
DB_LINK列がNULL以外の場合、そのシノニムはリモートデータベースのオブジェクトを参照しています。
SQL – DBリンク経由のシノニムを確認
SELECT owner, synonym_name, table_owner, table_name, db_linkFROM dba_synonymsWHERE db_link IS NOT NULLORDER BY db_link, owner, synonym_name;
無効(INVALID)なシノニムを特定する
シノニムが参照する先のオブジェクトが削除・リネームされると、シノニムは無効(INVALID)になります。DBA_OBJECTS の STATUS 列で確認できます。
SQL – 無効なシノニムを一覧表示
SELECT o.owner, o.object_name AS synonym_name, o.status, s.table_owner, s.table_name, s.db_linkFROM dba_objects oJOIN dba_synonyms s ON s.owner = o.owner AND s.synonym_name = o.object_nameWHERE o.object_type = 'SYNONYM' AND o.status = 'INVALID'ORDER BY o.owner, o.object_name;
注意:シノニム自体はINVALIDにならず常に VALID のままになるケースもあります(参照先の削除タイミングや権限状況による)。確実に無効化を確認するには、SELECT * FROM シノニム名 を実際に実行してORA-00980などのエラーが出るかを確認してください。
参照先オブジェクトが存在しないシノニムを確認する
SQL – 参照先が存在しないシノニム(孤立シノニム)
SELECT s.owner, s.synonym_name, s.table_owner, s.table_nameFROM dba_synonyms sWHERE s.db_link IS NULL -- ローカルオブジェクト参照のもの AND NOT EXISTS ( SELECT 1 FROM dba_objects o WHERE o.owner = s.table_owner AND o.object_name = s.table_name )ORDER BY s.owner, s.synonym_name;
シノニムの作成と削除
CREATE SYNONYM(プライベートシノニム)
SQL – CREATE SYNONYM
-- 自スキーマのシノニム(HRスキーマのEMPLOYEESにアクセス)CREATE SYNONYM emp FOR hr.employees;-- 上書き作成(既に存在する場合に削除不要)CREATE OR REPLACE SYNONYM emp FOR hr.employees;-- DBリンク経由のリモートオブジェクトへのシノニムCREATE SYNONYM remote_orders FOR scott.orders@prod_link;
CREATE PUBLIC SYNONYM(パブリックシノニム)
SQL – CREATE PUBLIC SYNONYM(DBA権限必要)
-- 全ユーザーがアクセス可能なパブリックシノニムCREATE PUBLIC SYNONYM emp FOR hr.employees;-- 参照するにはHRスキーマへのSELECT権限も別途必要GRANT SELECT ON hr.employees TO PUBLIC;
DROP SYNONYM(シノニムの削除)
SQL – DROP SYNONYM
-- プライベートシノニムの削除DROP SYNONYM emp;-- パブリックシノニムの削除(DBA権限必要)DROP PUBLIC SYNONYM emp;
補足:シノニムを削除しても、参照先のオブジェクト(テーブル・ビューなど)は削除されません。シノニムはあくまでエイリアスです。逆に参照先オブジェクトを削除してもシノニム自体は残りますが、使用するとエラー(ORA-00980)になります。
よくある質問(FAQ)
USER_SYNONYMSとALL_SYNONYMSの違いは?▼
USER_SYNONYMS は自分が作成したシノニムのみ表示します。ALL_SYNONYMS は自分のシノニムに加えてパブリックシノニムも含まれます。DBAロールがない一般ユーザーには DBA_SYNONYMS は使えないため、他スキーマのシノニムを確認したい場合は ALL_SYNONYMS を使いましょう。
ORA-00980 synonym translation is no longer valid が出たら?▼
シノニムが参照しているオブジェクト(テーブル・ビュー・関数など)が削除・リネームされたか、権限が失効しています。以下の手順で対処してください。
- 上記の「参照先が存在しないシノニム」クエリで対象シノニムを確認
- 参照先オブジェクトが存在するなら権限を確認(
DBA_TAB_PRIVS)
- シノニムを
CREATE OR REPLACE SYNONYM で正しい参照先に更新するか、不要なら DROP SYNONYM で削除
プライベートシノニムとパブリックシノニムが同名の場合どちらが優先されますか?▼
プライベートシノニムが優先されます。同名のシノニムが両方存在する場合、自スキーマのプライベートシノニムが使われます。パブリックシノニムを明示的に使いたい場合は PUBLIC.シノニム名 とはできないため、プライベートシノニムを削除するか別名で作成する必要があります。
まとめ
Oracleシノニムの確認・管理操作をまとめます。
| やりたいこと |
使うビュー・構文 |
| 自スキーマのシノニム一覧 |
SELECT * FROM user_synonyms |
| 特定スキーマのシノニム確認 |
dba_synonyms WHERE owner='SCOTT' |
| パブリックシノニム一覧 |
dba_synonyms WHERE owner='PUBLIC' |
| 参照先テーブルからシノニムを逆引き |
WHERE table_name='TABLE' AND table_owner='OWNER' |
| 無効なシノニムを特定 |
dba_objects WHERE object_type='SYNONYM' AND status='INVALID' |
| シノニムを作成 |
CREATE [OR REPLACE] [PUBLIC] SYNONYM 名前 FOR オブジェクト |
| シノニムを削除 |
DROP [PUBLIC] SYNONYM 名前 |
シノニムはスキーマ管理の透過性を高める便利な機能ですが、参照先が変わったときに孤立シノニムが残りやすい点に注意してください。定期的に参照先が存在しないシノニムのチェックを運用に組み込むことをおすすめします。