👋

シノニムについて

に公開

シノニムとは

シノニム(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_SYNONYMSOWNER='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