需在 Oracle 9i/10g 中透過 Heterogeneous Services (HS) 透明網關,同步訪問 SQL Server 的 pubs 與 Northwind 兩個資料庫。架構:
Oracle Server (192.168.0.1) ←── DB Link ──→ Gateway Server (192.168.0.2, Windows)
│
┌───────────┴───────────┐
▼ ▼
SQL Server: pubs SQL Server: Northwind
Oracle 9i Standard/Enterprise Edition 安裝時勾選 Oracle Transparent Gateway for Microsoft SQL Server。
$ORACLE_HOME\tg4msql\admin\)為每個目標資料庫建立獨立 init:
-- initpubs.ora
HS_FDS_CONNECT_INFO="SERVER=sqlserver_hostname;DATABASE=pubs"
HS_DB_NAME=pubs
HS_FDS_TRACE_LEVEL=OFF
HS_FDS_RECOVERY_ACCOUNT=RECOVER
HS_FDS_RECOVERY_PWD=RECOVER
-- initnorthwind.ora
HS_FDS_CONNECT_INFO="SERVER=sqlserver_hostname;DATABASE=Northwind"
HS_DB_NAME=Northwind
HS_FDS_TRACE_LEVEL=OFF
HS_FDS_RECOVERY_ACCOUNT=RECOVER
HS_FDS_RECOVERY_PWD=RECOVER
$ORACLE_HOME\network\admin\listener.ora)LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST = (ADDRESS = (PROTOCOL=TCP)(HOST=192.168.0.2)(PORT=1521)))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC = (GLOBAL_DBNAME=test9)(ORACLE_HOME=d:\oracle\ora92)(SID_NAME=test9))
(SID_DESC = (SID_NAME=pubs)(ORACLE_HOME=d:\Oracle\Ora92)(PROGRAM=tg4msql))
(SID_DESC = (SID_NAME=northwind)(ORACLE_HOME=d:\Oracle\Ora92)(PROGRAM=tg4msql))
)
關鍵點:PROGRAM=tg4msql 指定網關程式;每新增一個 SQL Server 資料庫,必須在 SID_LIST 新增對應 SID_DESC 並 重啟 TNSListener 服務。
tnsnames.ora 定義服務名pubs =
(DESCRIPTION =
(ADDRESS_LIST = (ADDRESS = (PROTOCOL=TCP)(HOST=192.168.0.2)(PORT=1521)))
(CONNECT_DATA = (SID=pubs))
(HS=pubs)
)
northwind =
(DESCRIPTION =
(ADDRESS_LIST = (ADDRESS = (PROTOCOL=TCP)(HOST=192.168.0.2)(PORT=1521)))
(CONNECT_DATA = (SID=northwind))
(HS=northwind)
)
$ tnsping pubs
$ tnsping northwind
-- 均顯示 OK (XX 毫秒) 即成功
GLOBAL_NAMES=FALSE預設 TRUE 要求 DB Link 名稱與遠端全域名一致,設為 FALSE 可自由命名:
ALTER SYSTEM SET GLOBAL_NAMES=FALSE;
-- 或會話級:ALTER SESSION SET GLOBAL_NAMES=FALSE;
CREATE PUBLIC DATABASE LINK pubs
CONNECT TO testuser IDENTIFIED BY testuser_pwd USING 'pubs';
CREATE PUBLIC DATABASE LINK northwind
CONNECT TO testuser IDENTIFIED BY testuser_pwd USING 'northwind';
-- 假設 SQL Server 兩庫均存在 testuser/testuser_pwd 且權限足夠
SELECT * FROM stores@pubs;
SELECT * FROM region@northwind;
Oracle 透過網關拉取 SQL Server 中繼數據時,欄位名帶雙引號 (大小寫敏感):
CREATE TABLE stores AS SELECT * FROM stores@pubs;
SELECT zip FROM stores; -- ORA-00904: 無效列名
SELECT "zip" FROM stores; -- 正確,需雙引號
檢視遷移後 DDL:
CREATE TABLE stores
(
"stor_id" CHAR(4) NOT NULL,
"stor_name" VARCHAR2(40),
"stor_address" VARCHAR2(40),
"city" VARCHAR2(20),
"state" CHAR(2),
"zip" CHAR(5)
) ...;
最佳實踐:遷移後立即重命名欄位移除雙引號,或建立不帶引號的視圖/同義詞供應用層使用。
| 位置 | 文件/項目 | 關鍵一致性要求 |
|---|---|---|
| Gateway Server | $OH\tg4msql\admin\init<SID>.ora | HS_DB_NAME = SID_NAME |
| Gateway Server | listener.ora → SID_LIST | SID_NAME = init<SID>.ora 同名;PROGRAM=tg4msql |
| Oracle Server | tnsnames.ora | SID = Gateway SID_NAME;HS = 同值 |
| Oracle Server | DB Link USING 子句 | 引用 tnsnames.ora 服務名 |
Oracle Transparent Gateway + Heterogeneous Services 實現了異構資料庫的無縫整合。關鍵在於:網關端每個目標庫獨立 init.ora + listener.ora 註冊 SID、Oracle 端 tnsnames.ora 對應 HS 服務名、GLOBAL_NAMES=FALSE 解除命名綁定、雙引號識別符遷移後處理。按清單核對,一次成功。