首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 教學

Oracle 同義詞完全指南:建立、權限、公共/私有、刪除與最佳實務

     編輯:Oracle 教學

Oracle 同義詞完全指南:建立、權限、公共/私有、刪除與最佳實務

同義詞是資料庫物件的別名,提供位置透明度:應用程式無需知道物件真實擁有者與位置,遷移、重構時只需修改同義詞定義。本文系統整理語法、權限模型、公共/私有差異、查詢驗證、刪除與實務建議。

核心語法

CREATE [PUBLIC] SYNONYM synonym_name FOR [schema.]object_name[@dblink];
  • PUBLIC:公共同義詞,所有使用者可見(需對基礎物件有權限)。
  • 無 PUBLIC:私有同義詞,僅建立者可見(或授權者)。
  • schema.:跨 Schema 參考,需建立者擁有 CREATE ANY SYNONYM 或物件擁有者授權。
  • @dblink:支援遠端資料庫物件別名。

實戰範例

1. 私有同義詞(開發常用)

CONN sys/password AS SYSDBA;
CREATE PUBLIC SYNONYM myemp FOR scott.emp;

-- 任何有權限的用戶均可直接用
CONN other_user/pass;
SELECT * FROM myemp;

3. 查詢同義詞定義

-- 當前用戶私有同義詞
SELECT * FROM user_synonyms;

-- 所有可見公共同義詞
SELECT * FROM all_synonyms WHERE table_owner = 'SCOTT';

-- DBA 視角
SELECT * FROM dba_synonyms WHERE synonym_name = 'MYEMP';

4. 刪除同義詞

  操作所需權限備註
  建立私有同義詞CREATE SYNONYM(自身 Schema)或 CREATE ANY SYNONYM(跨 Schema)預設 RESOURCE 角色含 CREATE SYNONYM
  建立公共同義詞CREATE PUBLIC SYNONYM通常僅 DBA 擁有
  使用同義詞對基礎物件的權限(SELECT/INSERT/EXECUTE 等)同義詞本身無權限,僅轉發
  刪除私有同義詞建立者或 DROP ANY SYNONYM
  刪除公共同義詞DROP PUBLIC SYNONYM僅 DBA


常見陷阱與避坑指南

陷阱現象原因解決
同名衝突ORA-00955: name is already used同 Schema 下同義詞/表/視圖同名命名規範:SYN_;先 DROP 再建
公共同義詞劫持應用意外訪問錯誤 Schema 物件PUBLIC 同義詞優先級高於私有同義詞/本地物件嚴格管控 PUBLIC 同義詞;應用指定 Schema 前綴
遠端同義詞失效ORA-02019: connection description for remote database not foundDB Link 未建立或 TNS 不通驗證 tnsping、DB Link 測試
DDL 後同義詞失效基礎表 RENAME/DROP,同義詞變無效同義詞不自動追蹤 DDL部署腳本同步維護同義詞;或用 Edition-Based Redefinition

最佳實務建議

  1. 命名規範:SYN__(如 SYN_SCOTT_EMP),一眼識別來源。
  2. 最小權限原則:優先用私有同義詞;公共同義詞僅限核心共享物件(如 DUAL、V$VERSION 類系統視圖)。
  3. 版本控管:同義詞 DDL 納入 Flyway/Liquibase 遷移腳本,隨 Schema 變更同步更新。
  4. 文檔化:在資料字典擴展註解記錄同義詞用途:COMMENT ON SYNONYM syn_scott_emp IS 'SCOTT.EMP 應用層別名,屏蔽 Schema 變更'。
  5. 定期清理:查詢 DBA_SYNONYMS 找出基礎物件不存在的失效同義詞:
  6. SELECT s.owner, s.synonym_name, s.table_owner, s.table_name
    FROM dba_synonyms s
    LEFT JOIN dba_objects o ON o.owner = s.table_owner AND o.object_name = s.table_name
    WHERE o.object_id IS NULL;

    總結

    同義詞是「零成本、零儲存、純元資料」的抽象層。善用它能實現Schema 解耦、應用遷移零代碼修改、多環境統一入口。核心原則:**私有優於公共、命名要規範、權限看基礎物件、DDL 要同步、失效要清理**。

    1. 上一篇文章:
    2. 下一篇文章:
    Copyright © 程式碼之家 All Rights Reserved