シノニムについて
シノニムとは
シノニム(synonym) は、
「オブジェクト(表・ビュー・シーケンスなど)に別名を付ける機能」 です。
つまり「長いスキーマ名付きのオブジェクト名」を、短く・簡単に扱うための“あだ名”です。
表やビューなどのオブジェクトに別名を付けることで、オブジェクトの指定を簡単に行えるようになったり、スキーマ名を隠蔽してセキュリティを高めたりすることができます。
これにより以下のような効果が得られます:
・長いスキーマ名を省略でき、SQLが簡潔になる
・オブジェクトの所在スキーマを隠蔽し、セキュリティを高められる
・アプリケーション側のSQL修正を最小限に抑えられる(スキーマ移動時など)
シノニムにはプライベートシノニムとパブリックシノニムの2種類があります。
プライベートシノニムはシノニムを作成したユーザーだけが使用できるシノニムであるのに対し、パブリックシノニムは全てのユーザーが使用できるシノニムです。
ただし、シノニムを使用するには、基となるオブジェクトに対する適切な権限が必要です。例えば、表のシノニムを使用して問合せを行う場合は、基になる表に対する参照権限が必要です。
プライベートシノニムを作成するにはCREATE SYNONYM権限、パブリックシノニムを作成するにはCREATE PUBLIC SYNONYM権限が必要になります。
CREATE [PUBLIC] SYNONYM シノニム名 FOR オブジェクト名;
パブリックシノニムとは
パブリック・シノニムは、すべてのユーザーが所有し、データベースの各ユーザーがアクセスできます。パブリック・シノニムには、すべてのユーザーがアクセスでき、どのユーザー・スキーマにも属しません。したがって、パブリック・シノニムの名前は、プライベート・シノニム名や表名と同じにすることができます。
パブリックシノニムを作成できるのは誰?
パブリックシノニムを作れる人 は 普通のユーザーではなく、DBA(管理者)権限を持つユーザーだけ です。
CREATE PUBLIC SYNONYM 権限
これは システム権限(system privilege) の一種で、
次のように DBA ユーザーが他ユーザーに付与できます:
-- SYS または SYSTEM で実行
GRANT CREATE PUBLIC SYNONYM TO USER_A;
bash-4.2$ sqlplus system/Oracle21c@//localhost:1521/xepdb1
SQL*Plus: Release 21.0.0.0.0 - Production on Tue Oct 21 12:19:10 2025
Version 21.3.0.0.0
Copyright (c) 1982, 2021, Oracle. All rights reserved.
Last Successful login time: Tue Oct 21 2025 12:01:36 +00:00
Connected to:
Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
SQL> GRANT CREATE PUBLIC SYNONYM TO user_a;
Grant succeeded.
ユーザーaでユーザーbに権限を与えようとすると以下のようになります。
bash-4.2$ sqlplus user_a/a@//localhost:1521/xepdb1
SQL> GRANT CREATE PUBLIC SYNONYM TO user_b;
GRANT CREATE PUBLIC SYNONYM TO user_b
*
ERROR at line 1:
ORA-01031: insufficient privileges
プライベートシノニムとは
プライベート・シノニムは、特定のユーザーが所有し、特定のユーザーのスキーマ内に存在します。プライベート・シノニムは、表名、ビュー名、順序名など他のオブジェクト名と同じネームスペースを共有します。したがって、プライベート・シノニムの名前は、同じスキーマ内の表名やビュー名と同じにすることはできません。
プライベートシノニムとパブリックシノニムの挙動
bash-4.2$ sqlplus user_a/a@//localhost:1521/xepdb1
SQL> CREATE TABLE emp (
emp_id NUMBER PRIMARY KEY,
2 3 emp_name VARCHAR2(50)
);
INSERT INTO emp VALUES ( 4 1, 'MIKE');
COMMIT;
-- プライベートシノニム作成(自分専用)
CREATE SYNONYM emp_private FOR emp;
-- パブリックシノニム作成(全ユーザー共有)
CREATE PUBLIC SYNONYM emp_pub FOR emp;
-- user_bに参照権限を付与
GRANT SELECT ON emp TO user_b;
Table created.
SQL> SQL>
1 row created.
SQL>
Commit complete.
SQL> SQL> SQL>
Synonym created.
SQL> SQL> SQL> CREATE PUBLIC SYNONYM emp_pub FOR emp
*
ERROR at line 1:
ORA-00955: name is already used by an existing object
SQL> SQL> SQL>
Grant succeeded.
SQL> exit
bash-4.2$ sqlplus user_b/b@//localhost:1521/xepdb1
-- パブリックシノニム経由ならOK
SELECT * FROM 2 SQL> SQL> emp_pub;
EMP_ID EMP_NAME
---------- --------------------------------------------------
1 MIKE
SQL> SELECT * FROM emp_private;
SELECT * FROM emp_private
*
ERROR at line 1:
ORA-00942: table or view does not exist
これで USER_A もパブリックシノニムを作成できるようになります。
まとめ
| 項目 | プライベートシノニム | パブリックシノニム |
|---|---|---|
| 所属 | 特定ユーザーのスキーマ内 |
PUBLIC(全スキーマ共通) |
| 使用できるユーザー | 作成したユーザー本人のみ | 全ユーザー |
| 作成権限 | CREATE SYNONYM |
CREATE PUBLIC SYNONYM(DBAなど管理者のみ) |
| 格納ビュー |
USER_SYNONYMS / ALL_SYNONYMS
|
DBA_SYNONYMS(OWNER='PUBLIC') |
| 所有者 | 作成したユーザー | PUBLIC |
| 名称の重複 | 同一スキーマ内では他オブジェクト名と重複不可 | 各スキーマのローカルオブジェクトより優先される(ただし同名プライベートシノニムがある場合はそちらが優先) |
| 対象オブジェクト | 同スキーマまたは他スキーマのオブジェクト | 任意スキーマのオブジェクト(全体共有) |
| 主な用途 | 個人スキーマ内での表・ビュー名の短縮 | どのユーザーからでも同名でアクセスしたい共通オブジェクトを提供 |
| 作成例 | CREATE SYNONYM emp_syn FOR emp; |
CREATE PUBLIC SYNONYM emp_pub FOR user_a.emp; |
| 削除方法 | DROP SYNONYM emp_syn; |
DROP PUBLIC SYNONYM emp_pub; |
Discussion