解決方案:在我方資料庫建立 Database Link (DB Link) 指向客戶庫,再建立 同義詞 映射遠端視圖/表,應用端如同操作本地物件。
編輯 $ORACLE_HOME/network/admin/tnsnames.ora(必須在資料庫伺服器主機上操作,非客戶端工具機):
LIMSTQ =
(DESCRIPTION =
(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.107.6.15)(PORT = 1521)))
(CONNECT_DATA = (SERVICE_NAME = VGSM))
)
注意:LIMSTQ 前不得有空格。
檢查 GLOBAL_NAMES 參數:
SHOW PARAMETER GLOBAL_NAMES;
-- 若 TRUE,DB Link 名稱必須等於遠端 DB_NAME/GLOBAL_NAME
-- 若 FALSE(本例),可自訂名稱
建立語法:
CREATE DATABASE LINK limstq.us.oracle.com
CONNECT TO jlgl IDENTIFIED BY jlgl
USING 'LIMSTQ';
驗證:SELECT * FROM dual@limstq.us.oracle.com;
-- 直接同義詞
CREATE SYNONYM jl_gljs_tb_lims FOR jlgl_lims@limstq.us.oracle.com;
-- 建議:建立 View 封裝,應用端只依賴 View
CREATE OR REPLACE VIEW jl_gljs_limstq_vw AS
SELECT * FROM jl_gljs_tb_lims;
應用端查詢:SELECT * FROM jl_gljs_limstq_vw;
成因 90% 以上:TNS 服務名配置在客戶端工具機(如 PL/SQL Developer 安裝電腦)而非資料庫伺服器主機的 tnsnames.ora 中。
$ORACLE_HOME/network/admin/tnsnames.ora。tnsping LIMSTQ 驗證連通性。GLOBAL_NAMES=TRUE 環境下,DB Link 名稱必須與遠端 GLOBAL_NAME 一致,否則報 ORA-02085。CREATE PUBLIC SYNONYM 權限),視授權策略決定。