この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:4
ページ更新者:guest
更新日時:2026-06-11 07:10:02

タイトル: シノニム
SEOタイトル: Oracle Synonym (シノニム) 完全ガイド(PUBLIC / DB Link)

この記事の要点
  • Synonym は Oracle のスキーマオブジェクトへの別名
  • Public Synonym は全ユーザ共有、Private Synonym は作成者専用
  • スキーマ・DB 跨ぎを透過化: SELECT * FROM hr.employees@prod_dbSELECT * FROM emp
  • DB Link と組み合わせて他 DB のテーブルを参照、アプリ側コード変更不要
  • PostgreSQL / MySQL には Synonym 機能なし → VIEW や Search Path で代替

Synonym とは

Oracle Database の Synonym (シノニム) は、テーブル / VIEW / プロシージャ / シーケンス等のスキーマオブジェクトに対する別名です。アプリ側コードを変更せずに参照先を切り替えたり、長いスキーマ名を省略したりできます。

-- 本来のテーブル
SELECT * FROM hr.employees;

-- Synonym を作っておけば
CREATE SYNONYM emp FOR hr.employees;

-- 短く書ける
SELECT * FROM emp;

Public Synonym と Private Synonym

種類作成権限参照可能ユーザ用途
Private SynonymCREATE SYNONYM作成者のスキーマだけ個人 / アプリ専用
Public SynonymCREATE PUBLIC SYNONYM全 DB ユーザ共通辞書 / 業務テーブル共有
-- Private (デフォルト)
CREATE SYNONYM emp FOR hr.employees;

-- Public (DBA 級権限必要)
CREATE PUBLIC SYNONYM emp FOR hr.employees;

-- 上書き
CREATE OR REPLACE SYNONYM emp FOR hr.employees_v2;

-- 削除
DROP SYNONYM emp;
DROP PUBLIC SYNONYM emp;

名前解決の優先順位

SELECT * FROM emp を発行したとき、Oracle は以下の順で名前を探します:

  1. 自スキーマのオブジェクト (自分が emp テーブルを持っている?)
  2. 自スキーマの Private Synonym (CREATE SYNONYM emp ...)
  3. Public Synonym (CREATE PUBLIC SYNONYM emp ...)

Public Synonym は最後なので、自分のスキーマに同名オブジェクトがあるとPublic Synonym は隠される点に注意。

DB Link との組み合わせ

Synonym の真価はDB Linkと組み合わせたとき。別 DB のテーブルをあたかも自 DB のテーブルのように参照できます:

-- 1. DB Link を作成 (本番 DB に接続)
CREATE DATABASE LINK prod_db
  CONNECT TO app_user IDENTIFIED BY "pwd"
  USING 'PROD';   -- tnsnames.ora の名前

-- 2. 別 DB のテーブルを直接参照(うっとうしい)
SELECT * FROM hr.employees@prod_db;

-- 3. Synonym を被せて透過化
CREATE SYNONYM emp FOR hr.employees@prod_db;

-- 4. 以降は普通のテーブルのように
SELECT * FROM emp;

-- アプリ側: DB 移行時にも SQL 変更不要
-- ・最初は本番 DB を直接参照
-- ・後でローカルにレプリカ作って Synonym 差し替え → アプリ無修正

用途別ユースケース

シナリオSynonym の使い方
マスタ DB を別 DB に切り出しDB Link + Synonym で透過アクセス
スキーマ名を省略したいCREATE SYNONYM emp FOR hr.employees
テーブル名を変更したいがアプリ非改修旧名 Synonym → 新名テーブル
環境別 (本番 / ステージ) で参照先切替環境毎に CREATE OR REPLACE SYNONYM
後方互換 (旧 API 名残し)旧プロシージャ名を新名にリダイレクト
マルチテナントテナント毎にスキーマ + Public Synonym で共有マスタ

確認系 SQL

-- 自分の Private Synonym 一覧
SELECT * FROM USER_SYNONYMS;

-- 全 DB のシノニム (Public 含む、DBA 権限)
SELECT * FROM ALL_SYNONYMS WHERE SYNONYM_NAME = 'EMP';

-- 参照先の確認
SELECT SYNONYM_NAME, TABLE_OWNER, TABLE_NAME, DB_LINK
FROM   ALL_SYNONYMS
WHERE  OWNER IN ('PUBLIC', USER);

-- 壊れた Synonym (参照先が消失)
SELECT * FROM ALL_OBJECTS
WHERE OBJECT_TYPE = 'SYNONYM' AND STATUS = 'INVALID';

権限

-- Private Synonym 作成権限
GRANT CREATE SYNONYM TO app_user;

-- Public Synonym 作成権限 (注意: 強権限)
GRANT CREATE PUBLIC SYNONYM TO admin_user;

-- 参照対象テーブルへの権限も必須
GRANT SELECT ON hr.employees TO app_user;

-- Synonym 自体に権限は付けられない (参照先のテーブル権限が効く)

Synonym の落とし穴

落とし穴説明
名前衝突自スキーマのテーブルが優先され Public Synonym が隠れる
権限の二重管理Synonym + 参照先テーブルの両方の権限が必要
性能名前解決のオーバーヘッドはあるが微小 (キャッシュされる)
DDL 影響参照先テーブル変更で Synonym が INVALID 状態に → 再コンパイル
セキュリティ監査の難しさ誰がどのテーブルを参照しているか追いにくい

他 DB での代替手段

DB代替
PostgreSQLVIEW (CREATE VIEW emp AS SELECT * FROM hr.employees)、または search_path
MySQLVIEW または CREATE TABLE emp AS SELECT * ... (実体)
SQL ServerSYNONYM 文法ほぼ同じ。Linked Server + Synonym で Oracle 同様
DB2ALIAS (CREATE ALIAS emp FOR hr.employees)

PostgreSQL での擬似実装例:

-- search_path で複数スキーマを順に探索
SET search_path TO hr, public;
SELECT * FROM employees;   -- hr.employees に解決

-- VIEW で別名
CREATE VIEW emp AS SELECT * FROM hr.employees;

-- 外部 DB は dblink / postgres_fdw
CREATE EXTENSION postgres_fdw;
CREATE SERVER prod_srv ...;
CREATE FOREIGN TABLE emp (...) SERVER prod_srv OPTIONS (schema_name 'hr', table_name 'employees');

FAQ

Q: Synonym と VIEW の違いは?
A: VIEW は SELECT 文を持ち列を再定義できる。Synonym は単純なエイリアス。実 Oracle では多くの場合 Synonym + VIEW 併用。

Q: 同名で Public と Private の両方を作ったら?
A: 自スキーマからは Private が優先。他ユーザは Public が見える。混乱の元なので推奨されない。

Q: Public Synonym は誰でも作れる?
A: いいえ。CREATE PUBLIC SYNONYM 権限が必要で、通常 DBA だけ持ちます。

Q: 削除したシノニムの権限は?
A: シノニム自体に GRANT 不可。GRANT は参照先テーブルに掛けるので、Synonym DROP しても権限は残ります。