「スキーマ名を毎回書きたくない」「DBリンクのテーブルをローカルのように使いたい」——Oracleのシノニム(SYNONYM)はオブジェクトに別名を付ける機能です。開発を楽にしてマイグレーションにも強くなるシノニムの使い方を解説します。
目次
1. シノニムとは(なぜ使うのか) {#about}
シノニムとはテーブル・ビュー・プロシージャ・DBリンクなどのオブジェクトに対する「別名」です。
シノニムを使うメリット:
シノニムなし → SELECT * FROM SCOTT.EMPLOYEES@REMOTE_DB;
シノニムあり → SELECT * FROM EMP; ← スッキリ!| メリット | 詳細 |
|---|---|
| SQLの可読性向上 | スキーマ名・DBリンク名を省略できる |
| 移行の柔軟性 | 実体のオブジェクトを変えてもシノニムを付け替えるだけ |
| アクセス権管理 | シノニム経由でアクセス制限が可能 |
2. シノニムの作成(CREATE SYNONYM) {#create}
基本の作成
-- 同じスキーマ内のテーブルにシノニムを作成
CREATE SYNONYM EMP FOR EMPLOYEES;
-- 別スキーマのテーブルにシノニムを作成(スキーマ名を隠せる)
CREATE SYNONYM EMP FOR SCOTT.EMPLOYEES;
-- DBリンク経由のオブジェクトにシノニムを作成
CREATE SYNONYM REMOTE_EMP FOR SCOTT.EMPLOYEES@REMOTE_DB;
-- ビュー・プロシージャ・マテリアライズドビューにも作成可能
CREATE SYNONYM V_DEPT FOR V_DEPARTMENT_SUMMARY;
CREATE SYNONYM PROC_SALARY FOR SCOTT.UPDATE_SALARY;OR REPLACE で既存シノニムを更新
-- 既存のシノニムを上書き(DROP → CREATE が不要)
CREATE OR REPLACE SYNONYM EMP FOR HR.EMPLOYEES;3. パブリックシノニム vs プライベートシノニム {#public-private}
| 種類 | スコープ | 作成権限 |
|---|---|---|
| プライベートシノニム(デフォルト) | 作成したユーザーのみ使用可能 | CREATE SYNONYM |
| パブリックシノニム | DBの全ユーザーが使用可能 | CREATE PUBLIC SYNONYM(DBA権限) |
パブリックシノニムの作成
-- DBA権限で実行
CREATE PUBLIC SYNONYM EMP FOR SCOTT.EMPLOYEES;
-- パブリックシノニムへのアクセス権は元テーブルの権限が必要
GRANT SELECT ON SCOTT.EMPLOYEES TO PUBLIC;注意:
CREATE PUBLIC SYNONYMはシノニムを作るだけで、元テーブルへのアクセス権限は別途必要です。
4. シノニムの確認 {#check}
-- 自分のシノニムを確認
SELECT SYNONYM_NAME, TABLE_OWNER, TABLE_NAME, DB_LINK
FROM USER_SYNONYMS
ORDER BY SYNONYM_NAME;出力例:
SYNONYM_NAME TABLE_OWNER TABLE_NAME DB_LINK
------------- ----------- ----------- -----------
EMP SCOTT EMPLOYEES (null)
REMOTE_EMP SCOTT EMPLOYEES REMOTE_DB
V_DEPT SCOTT V_DEPT_SUM (null)-- 全ユーザーのシノニムを確認(DBA権限)
SELECT OWNER, SYNONYM_NAME, TABLE_OWNER, TABLE_NAME
FROM DBA_SYNONYMS
WHERE OWNER IN ('SCOTT', 'PUBLIC')
ORDER BY OWNER, SYNONYM_NAME;
-- パブリックシノニムのみ確認
SELECT SYNONYM_NAME, TABLE_OWNER, TABLE_NAME
FROM ALL_SYNONYMS
WHERE OWNER = 'PUBLIC'
ORDER BY SYNONYM_NAME;5. シノニムを使ったSQL {#usage}
-- シノニム EMP を使って SCOTT.EMPLOYEES を操作
SELECT * FROM EMP;
INSERT INTO EMP (employee_id, last_name) VALUES (9999, 'テスト');
UPDATE EMP SET salary = 80000 WHERE employee_id = 100;
DELETE FROM EMP WHERE employee_id = 9999;
-- DBリンクシノニム経由でリモートテーブルを操作
SELECT * FROM REMOTE_EMP WHERE department_id = 10;
-- シノニム経由でプロシージャを実行
EXEC PROC_SALARY(100, 1.1);6. シノニムの削除 {#drop}
-- プライベートシノニムを削除
DROP SYNONYM EMP;
-- パブリックシノニムを削除(DBA権限が必要)
DROP PUBLIC SYNONYM EMP;シノニムを削除しても元のオブジェクトは削除されません。
7. よくある使いどころとベストプラクティス {#best-practice}
開発環境で本番DBのデータを参照する
-- 本番DBへのDBリンク経由テーブルにシノニムを作成
-- 開発者は@PROD_DBを意識せずに使える
CREATE PUBLIC SYNONYM PROD_SALES FOR SALES@PROD_DB;
GRANT SELECT ON SCOTT.SALES TO DEV_SCHEMA;スキーマ移行時にシノニムで吸収する
-- テーブルを SCOTT スキーマから HR スキーマに移行する場合
-- 既存のコードを変えずにシノニムで吸収
CREATE OR REPLACE SYNONYM SCOTT.EMPLOYEES FOR HR.EMPLOYEES;アプリ共通のパブリックシノニムを整備する
-- アプリが使うテーブルを全ユーザーからアクセスしやすくする
CREATE PUBLIC SYNONYM ORDERS FOR APPSCHEMA.ORDERS;
CREATE PUBLIC SYNONYM CUSTOMERS FOR APPSCHEMA.CUSTOMERS;
CREATE PUBLIC SYNONYM PRODUCTS FOR APPSCHEMA.PRODUCTS;シノニムの参照先が存在するか確認する
-- シノニムの参照先オブジェクトが存在するか確認
SELECT S.SYNONYM_NAME, S.TABLE_NAME,
CASE WHEN O.OBJECT_NAME IS NOT NULL THEN 'VALID'
ELSE '参照先なし(無効)'
END AS STATUS
FROM USER_SYNONYMS S
LEFT JOIN ALL_OBJECTS O
ON O.OWNER = S.TABLE_OWNER AND O.OBJECT_NAME = S.TABLE_NAME
ORDER BY STATUS;8. まとめ {#summary}
作成時
□ 同スキーマ内の長いテーブル名やビュー名にシノニムを作成して開発効率UP
□ 別スキーマ・DBリンク経由のオブジェクトにシノニムを作成してSQLをシンプルに
□ チーム全体で使う場合はパブリックシノニム(要DBA権限)
運用時
□ USER_SYNONYMS で参照先が正しいか定期確認
□ 元テーブルの移行・リネーム後はCREATE OR REPLACE SYNONYMで更新
□ 不要になったシノニムは DROP SYNONYM で削除
注意点
□ パブリックシノニム作成だけでは元テーブルにアクセスできない
→ GRANT SELECT ON 元テーブル TO PUBLIC(またはユーザー)が必要
□ シノニムと同名のローカルテーブルがあるとシノニムは無視される
(ローカルオブジェクトが優先)関連記事:









コメント