同義詞是資料庫物件的別名,提供位置透明度:應用程式無需知道物件真實擁有者與位置,遷移、重構時只需修改同義詞定義。本文系統整理語法、權限模型、公共/私有差異、查詢驗證、刪除與實務建議。
CREATE [PUBLIC] SYNONYM synonym_name FOR [schema.]object_name[@dblink];
PUBLIC:公共同義詞,所有使用者可見(需對基礎物件有權限)。PUBLIC:私有同義詞,僅建立者可見(或授權者)。schema.:跨 Schema 參考,需建立者擁有 CREATE ANY SYNONYM 或物件擁有者授權。@dblink:支援遠端資料庫物件別名。CONN sys/password AS SYSDBA; CREATE PUBLIC SYNONYM myemp FOR scott.emp; -- 任何有權限的用戶均可直接用 CONN other_user/pass; SELECT * FROM myemp;
-- 當前用戶私有同義詞 SELECT * FROM user_synonyms; -- 所有可見公共同義詞 SELECT * FROM all_synonyms WHERE table_owner = 'SCOTT'; -- DBA 視角 SELECT * FROM dba_synonyms WHERE synonym_name = 'MYEMP';
操作 所需權限 備註 建立私有同義詞 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 found | DB Link 未建立或 TNS 不通 | 驗證 tnsping、DB Link 測試 |
| DDL 後同義詞失效 | 基礎表 RENAME/DROP,同義詞變無效 | 同義詞不自動追蹤 DDL | 部署腳本同步維護同義詞;或用 Edition-Based Redefinition |
SYN__ (如 SYN_SCOTT_EMP),一眼識別來源。DUAL、V$VERSION 類系統視圖)。COMMENT ON SYNONYM syn_scott_emp IS 'SCOTT.EMP 應用層別名,屏蔽 Schema 變更'。DBA_SYNONYMS 找出基礎物件不存在的失效同義詞: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 要同步、失效要清理**。