Oracleシノニムの作成と管理方法【パブリック・プライベート完全ガイド】

当ページのリンクには広告が含まれています。

「スキーマ名を毎回書きたくない」「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(またはユーザー)が必要
□ シノニムと同名のローカルテーブルがあるとシノニムは無視される
  (ローカルオブジェクトが優先)

関連記事:

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

ITの事や自分の経験談など綴っていきたいと思っています。

コメント

コメントする

CAPTCHA


目次