跨數據庫查詢是分佈式應用常見需求。Oracle Database Link(DB Link)提供透明的遠程表訪問能力。本文詳細演示創建 Public Database Link 的完整語法、TNS 連接串配置、權限控制與常見錯誤排查。
CREATE PUBLIC DATABASE LINK link_name
CONNECT TO remote_user IDENTIFIED BY "password"
USING '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.101)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ora9i)
)
)';
| 子句 | 說明 | 示例 |
|---|---|---|
PUBLIC | 所有用戶可用;省略則為私有 DB Link | PUBLIC |
link_name | 鏈接名,本地引用遠程對象時使用 | test_link |
CONNECT TO ... IDENTIFIED BY | 遠程數據庫認證用戶/密碼 | test / "test" |
USING '...' | TNS 連接描述符(長字符串) | 見上完整示例 |
若本地 tnsnames.ora 已配置別名 REMOTE_DB:
CREATE PUBLIC DATABASE LINK test_link
CONNECT TO test IDENTIFIED BY "test"
USING 'REMOTE_DB';
更易維護,IP/端口/SID 變更只需改 tnsnames.ora。
-- 查詢遠程表
SELECT * FROM employees@test_link;
-- 跨庫 JOIN
SELECT e.ename, d.dname
FROM emp@test_link e, dept d
WHERE e.deptno = d.deptno;
-- DML 操作(需遠程用戶有權限)
INSERT INTO table@test_link VALUES (...);
PUBLIC DB Link 需 CREATE PUBLIC DATABASE LINK 系統權限(通常 DBA 擁有)。CREATE DATABASE LINK。| 錯誤 | 原因 | 解決 |
|---|---|---|
| ORA-12154: TNS:could not resolve | USING 字符串格式錯誤或 tnsnames.ora 別名不存在 | 檢查括號匹配、HOST/IP、SERVICE_NAME/SID;tnsping 測試 |
| ORA-12514: Listener does not currently know of service | 遠程 SERVICE_NAME 拼寫錯誤或未註冊 | 遠程執行 lsnrctl status 確認服務名 |
| ORA-01017: invalid username/password | 認證信息錯誤 | 核對遠程用戶/密碼,注意大小寫與特殊字符轉義 |
| ORA-02019: connection description for remote database not found | 私有 DB Link 未指定 USING 或 USING 為空 | 補全 USING 子句 |
CONNECT TO user IDENTIFIED BY pwd,所有使用者以同一遠程身份連接。CREATE PUBLIC DATABASE LINK ... CONNECT TO CURRENT_USER USING ...,需雙向信任(Enterprise User Security / SSL),用戶以自身身份在遠程認證。Database Link 是 Oracle 跨庫訪問的基石。掌握「完整 TNS 描述符」與「tnsnames.ora 別名」兩種創建方式,配合權限最小化原則,即可安全高效實現分佈式查詢。