GLOBAL_NAMES 是控制 Database Link(DB Link)命名強制性的關鍵參數。設為 TRUE 時,DB Link 名稱必須與目標資料庫的 GLOBAL_NAME 完全一致。本文透過雙節點實測(Windows XJ ↔ Linux RAC DMDB),系統驗證參數行為、錯誤現象、多連線解決方案與 Schema 權限陷阱。
| 角色 | 主機/版本 | GLOBAL_NAME | 初始 GLOBAL_NAMES |
|---|---|---|---|
| 來源庫(發起連線) | Windows 2003, 10.2.0.1 | XJ | FALSE |
| 目標庫(被連線) | Linux AS5 RAC, 10.2.0.1 | DMDB | FALSE |
-- 來源庫 XJ
CREATE DATABASE LINK test_link CONNECT TO test IDENTIFIED BY test USING 'DMDB';
SELECT * FROM dual@test_link; -- 成功
✅ DB Link 名稱任意,連線正常。
-- 目標庫 DMDB
ALTER SYSTEM SET global_names = TRUE;
-- 來源庫 XJ(未重建 DB Link)
SELECT * FROM dual@test_link; -- 成功
CREATE DATABASE LINK test_link2 ... -- 成功
SELECT * FROM dual@test_link2; -- 成功
✅ 目標庫 GLOBAL_NAMES=TRUE 不影響 來源庫現有或新建 DB Link 使用。
-- 來源庫 XJ
ALTER SYSTEM SET global_names = TRUE;
SELECT * FROM dual@test_link2; -- ❌ ORA-02085: DB Link TEST_LINK2 連線到 DMDB
SELECT * FROM dual@test_link; -- ❌ ORA-02085
❌ 來源庫 GLOBAL_NAMES=TRUE 導致所有指向 DMDB 的 DB Link 必須命名為 DMDB,否則報錯。
ALTER SYSTEM SET global_names = FALSE;
SELECT * FROM dual@test_link; -- 成功
驗證結論:只有發起連線那一端的 GLOBAL_NAMES 參數生效。
GLOBAL_NAMES=TRUE 的強制效力,僅作用於「建立並使用 DB Link 的那個資料庫實例」。
若來源庫設 TRUE,則該來源庫建立的所有 DB Link,名稱必須等於目標資料庫的 GLOBAL_NAME。
場景:來源庫 GLOBAL_NAMES=TRUE,需建立多條連往同一目標庫(如不同用戶、不同網路路徑、不同服務名稱)的 DB Link,但名稱都必須叫 DMDB,會衝突。
-- 來源庫 XJ (GLOBAL_NAMES=TRUE)
CREATE DATABASE LINK "DMDB@LINK1" CONNECT TO test IDENTIFIED BY test USING 'dmdb';
CREATE DATABASE LINK "DMDB@LINK2" CONNECT TO test2 IDENTIFIED BY test2 USING 'dmdb';
-- 使用時
SELECT * FROM dual@"DMDB@LINK1";
SELECT * FROM dual@"DMDB@LINK2";
GLOBAL_NAME@CONNECT_QUALIFIER,其中 CONNECT_QUALIFIER 可任意自訂。DBA_DB_LINKS 中 DB_LINK 欄位顯示為 DMDB@LINK1,HOST 欄位仍為服務名稱 dmdb。嘗試以 A 用戶為 B 用戶建立 DB Link:
-- A 用戶執行
CREATE DATABASE LINK B.LINKB CONNECT TO ... USING ...;
結果:實際建立的是 A 用戶下名為 B.LINKB 的 DB Link,而非 B 用戶的物件。因 DB Link 名稱允許含點號(.),Oracle 視為單一物件名稱,不解析為 Schema.物件。
CREATE DATABASE LINK 權限給目標用戶,由其自行建立。CREATE PUBLIC DATABASE LINK ...(需 CREATE PUBLIC DATABASE LINK 系統權限)。GLOBAL_NAMES=TRUE,強制 DB Link 命名與 GLOBAL_NAME 一致,利於治理與審計。DB_NAME.DOMAIN 格式(如 PROD.ORACLE.COM),避免跨環境衝突。@QUALIFIER 語法,避免為繞過限制而設 FALSE。CREATE DATABASE LINK,嚴控 CREATE PUBLIC DATABASE LINK。-- 查看當前庫 GLOBAL_NAME 與參數
SELECT * FROM global_name;
SHOW PARAMETER global_names;
-- 查看所有 DB Link 詳細資訊
SELECT owner, db_link, username, host, created
FROM dba_db_links
ORDER BY owner, db_link;