シノニムとは
表・ビュー・シーケンス・ファンクション・プロシージャ・パッケージなどのオブジェクトに付ける別名(エイリアス)。
以下のような目的で使用される。
- 長いスキーマ修飾(
スキーマ名.オブジェクト名)を省略してSQLを簡潔にする - オブジェクトの所在スキーマを隠蔽し、セキュリティを高める
- アプリケーション側のSQL修正を最小化する(スキーマ移動・リネーム時など)
シノニムの種類
① プライベートシノニム
- 作成したユーザーのスキーマに格納される
- そのシノニムを所有するユーザーのみが使用できる(他ユーザーは使用できない)
- 作成には
CREATE SYNONYMシステム権限が必要 - プライベートシノニムの名前は、同じスキーマ内の表名・ビュー名と同じにすることはできない(同じネームスペースを共有するため)
② パブリックシノニム
- どのスキーマにも属さない(PUBLICネームスペースに格納される)
- 作成には
CREATE PUBLIC SYNONYMシステム権限が必要(通常は DBA 権限を持つユーザーが他のユーザーに付与する) - パブリックシノニムにアクセスすること自体は権限なしでできるが、シノニムが指すオブジェクト(表など)に対するオブジェクト権限は別途必要
- パブリックシノニムの名前は、プライベートシノニム名や表名と同じにすることができる
シノニムの作成
CREATE [OR REPLACE] [PUBLIC] SYNONYM <シノニム名>
FOR [<スキーマ名>.]<オブジェクト名>[@<DBリンク名>];
-
OR REPLACEを指定すると既存の同名シノニムを削除せずに再定義できる -
PUBLICを指定するとパブリックシノニム、指定しないとプライベートシノニムが作成される -
FOR句にスキーマ名を省略すると、作成ユーザー自身のスキーマのオブジェクトを参照する - シノニムを作成する時点では、参照先のオブジェクトが存在しなくてもエラーにならない(シノニムの参照解決は使用時に行われる)
他スキーマ・リモートオブジェクトへのシノニム
-- 他スキーマ内オブジェクトへのシノニム
CREATE OR REPLACE PUBLIC SYNONYM <シノニム名>
FOR <スキーマ名>.<オブジェクト名>;
-- データベースリンクを経由するリモートオブジェクトへのシノニム
CREATE OR REPLACE PUBLIC SYNONYM <シノニム名>
FOR <オブジェクト名>@<DBリンク名>;
シノニムに必要な権限まとめ
| 操作 | 必要な権限 |
|---|---|
| プライベートシノニムの作成 |
CREATE SYNONYM システム権限 |
| パブリックシノニムの作成 |
CREATE PUBLIC SYNONYM システム権限 |
| シノニムを通じたオブジェクトの参照 | 参照先オブジェクトへのオブジェクト権限が別途必要 |
| 自スキーマのプライベートシノニムの削除 | 特に権限不要 |
| 他スキーマのプライベートシノニムの削除 |
DROP ANY SYNONYM システム権限 |
| パブリックシノニムの削除 |
DROP PUBLIC SYNONYM システム権限 |
シノニムの削除
-- プライベートシノニムの削除
DROP SYNONYM <シノニム名>;
-- パブリックシノニムの削除
DROP PUBLIC SYNONYM <シノニム名>;
-
PUBLICを指定するとパブリックシノニムを削除する -
PUBLICを指定しないとプライベートシノニムを削除する - シノニムを削除しても、シノニムが指していた元のオブジェクトは削除されない
プライベートシノニムとパブリックシノニムの比較
| 特性 | プライベートシノニム | パブリックシノニム |
|---|---|---|
| 格納場所 | 作成ユーザーのスキーマ | PUBLICネームスペース(スキーマなし) |
| 作成権限 | CREATE SYNONYM |
CREATE PUBLIC SYNONYM |
| 使用範囲 | 所有ユーザーのみ | すべてのユーザー(オブジェクト権限は別途必要) |
| 名前の衝突 | 同スキーマの表・ビュー名と重複不可 | プライベートシノニム・表名と重複可 |
| 削除権限 | 自スキーマは不要 / 他スキーマは DROP ANY SYNONYM
|
DROP PUBLIC SYNONYM |
プライベートシノニムと同名オブジェクトの優先順位
同名のプライベートシノニムとパブリックシノニムが存在する場合、プライベートシノニムが優先される。
また、同名の表やビューがスキーマに存在する場合は、その表/ビューが優先され、シノニムは使用されない。