Oracle 強制全局唯一標識:GLOBAL_NAME = DB_NAME.DB_DOMAIN。
例:
DB1: DB_NAME=DBA, DB_DOMAIN=WORLD → GLOBAL_NAME=DBA.WORLD
DB2: DB_NAME=ORA9I, DB_DOMAIN=ORACLE.COM → GLOBAL_NAME=ORA9I.ORACLE.COM
| global_names 值 (本地庫) | DB Link 命名規則 | 典型場景 |
|---|---|---|
| FALSE (默認) | 任意名稱,如 CREATE DATABASE LINK mylink ... |
開發/測試環境、單向簡單訪問、異構舊系統 |
| TRUE | **必須與遠端庫 GLOBAL_NAME 完全一致** (大小寫不敏感)CREATE DATABASE LINK "ORA9I.ORACLE.COM" ... |
生產環境、雙向複製、Data Guard、Oracle Streams/GoldenGate 前置條件 |
關鍵點:該參數**僅影響本地庫創建 DB Link 時的命名校驗**,與遠端庫無關。
| 模式 | 語法 | 認證來源 | 適用場景 |
|---|---|---|---|
| Fixed User (固定用戶) | CREATE DATABASE LINK dblink CONNECT TO remote_user IDENTIFIED BY pwd USING 'tns_alias'; |
DB Link 定義中顯式指定的遠端用戶/密碼 | 應用統一賬戶訪問、密碼輪換集中管理、跨安全域 |
| Connected User (當前用戶) | CREATE DATABASE LINK dblink USING 'tns_alias'; |
發起會話的本地用戶同名同密碼映射到遠端 | 單點登錄 (SSO) 環境、審計需保留原始用戶身份 |
第三類:CURRENT_USER (存儲過程定義者權限/調用者權限上下文中動態解析),高級安全/細粒度訪問控制場景使用。
-- 環境: LOCAL (DBA.WORLD) -> REMOTE (ORA9I.ORACLE.COM)
-- TNS alias: 'as3' (LOCAL->REMOTE), 'dba' (REMOTE->LOCAL)
-- 1. global_names=FALSE, Connected User
CREATE DATABASE LINK foo USING 'as3';
SELECT * FROM global_name@foo; -- 成功返回 ORA9I.ORACLE.COM
-- 2. global_names=FALSE, Fixed User
CREATE DATABASE LINK woo CONNECT TO mhung IDENTIFIED BY huang USING 'as3';
SELECT * FROM global_name@woo; -- 成功
-- 3. global_names=TRUE, Connected User (舊 link 失效)
ALTER SYSTEM SET global_names=TRUE;
SELECT * FROM global_name@foo; -- ORA-02085: database link FOO.WORLD connects to ORA9I.ORACLE.COM
-- 必須重建
CREATE DATABASE LINK "ORA9I.ORACLE.COM" USING 'as3';
SELECT * FROM global_name@"ORA9I.ORACLE.COM"; -- 成功
-- 4. global_names=TRUE, Fixed User
CREATE DATABASE LINK "ORA9I.ORACLE.COM" CONNECT TO mhung IDENTIFIED BY huang USING 'as3';
CREATE PUBLIC DATABASE LINK ...:所有用戶可見,SELECT * FROM table@link 直接用。CREATE DATABASE LINK ... (私有):僅擁有者可見,其他用戶需 owner.link_name。
-- ON LOCAL (DBA.WORLD)
ALTER SYSTEM SET global_names=TRUE SCOPE=BOTH;
CREATE PUBLIC DATABASE LINK "ORA9I.ORACLE.COM" USING 'as3';
-- 授權遠端複製用戶
GRANT CREATE SESSION, CREATE TABLE TO repl_user IDENTIFIED BY repl_pwd;
-- ON REMOTE (ORA9I.ORACLE.COM)
ALTER SYSTEM SET global_names=TRUE SCOPE=BOTH;
CREATE PUBLIC DATABASE LINK "DBA.WORLD" USING 'dba';
-- 驗證雙向連通
SELECT * FROM dual@"ORA9I.ORACLE.COM";
SELECT * FROM dual@"DBA.WORLD";
-- 遠端創建同義詞屏蔽 DB Link
CREATE SYNONYM remote_emp FOR scott.emp@"DBA.WORLD";
-- 本地透明訪問
SELECT * FROM remote_emp; -- 實際走 DB Link
tnsnames.ora 雙端配置正確,tnsping 通。IDENTIFIED BY 區分大小寫,引號包裹 IDENTIFIED BY "PassWord123"。DB Link 是 Oracle 跨實例訪問的基石。**global_names=TRUE + PUBLIC DB Link + Fixed User 認證 + Synonym 封裝** 是企業級部署的標準組合。理解命名規則、認證模式、雙向部署邏輯,能避開 90% 的跨庫連接故障。