做ETL,肯定少不了經常會從不同的數據庫直接進行數據的操作,為了更好的進行跨庫操作,SQL SERVER 2012擁有LinkedServer功能。前段時間寫了個SQL SERVER同種數據庫直接的鏈接數據庫的鏈接,具體請參考:http://blog.csdn.net/waterxcfg304/article/details/42004753
下面我來介紹下如何通過SQL SERVER 2012來建立ORACLE11G的鏈接服務器。
一,創建鏈接服務
1, 創建鏈接服務器之前,一定要確保你的SQL SERVER服務器上有ORACLE的客戶端程序或者安裝了ORACLE數據庫服務器。
下圖可以看出我的SQL SERVER服務器上是有ORACLE11G的驅動程序的。
二,通過圖形界面建立鏈接服務器
需要填寫的信息:
1, 鏈接服務器:ORACLE11G,這個是隨便寫的
2, 服務器類型:選擇ORACLEProvider for OLE DB
3, 產品名稱: 寫 ORACLE,一般都寫這個
4, 數據源:ORCL 這ORCL不是隨便寫的,一定是tnsnames.ora里的服務名,還要注意listener的配置。
下面是我tnsnames.ora里的配置信息:
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =R9HDET7.vscsh.com)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL)
)
)
下面是我的listener.ora的配置:
SID_LIST_LISTENER=
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME =D:\oracle11g\app\product\11.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS ="EXTPROC_DLLS=ONLY:D:\oracle11g\app\product\11.2.0\dbhome_1\bin\oraclr11.dll")
)
(SID_DESC =
(GLOBAL_DBNAME =orcl)
(ORACLE_HOME =D:\oracle11g\app\product\11.2.0\dbhome_1)
(SID_NAME =orcl)
)
))
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY =EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST =R9HDET7.vscsh.com)(PORT = 1521))
)
)
三,鏈接服務器安全性配置
1,選擇—〉使用此安全上下文建立鏈接,輸入登錄ORACLE數據庫的用戶名和密碼
2,點擊[確定],出現如下的錯誤。
四,解決[無法創建鏈接服務器“ORACLE11G”的 OLE DB 訪問接口“OraOLEDB.Oracle”的實例。 (.NetSqlClient Data Provider)]的錯誤
這個問題一般是由於注冊表中缺少相關信息造成的,我們只需要補全這部分信息即可解決。
解決方法如下:
1, 打開“運行”窗口,輸入“regedit”,回車。
2, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MicrosoftSQLServer\MSSQL11.MSSQLSERVER\Providers
在Providers下面一般來說是看不到OraOLEDB.Oracle這一項的,於是新建這一項。
在Providers上面右鍵選擇New -> Key,把新增加的項改名為“OraOLEDB.Oracle”
3, 為“OraOLEDB.Oracle”這個鍵新增一個DWORD Value,把名字改為“AllowInProcess”
4, 為“OraOLEDB.Oracle”這個鍵新增一個DWORDValue,把名字改為“AllowInProcess”
5, 把“AllowInProcess”的值改為“00000001”
6,改好后的效果如圖。修改即刻生效,現在就可以再去訪問鏈接服務器上的Oracle數據庫了。
7,但是這個時候我再次做鏈接服務器的時候,還是出現了上面同樣的錯誤提示如下:
8,百思考不知道原因啊??突然我發現如下:鏈接服務器—〉訪問接口—〉OraOLEDB.Oracle—〉允許進程內沒有勾上,但是我想上面的配置4里已經有(為“OraOLEDB.Oracle”這個鍵新增一個DWORD Value,把名字改為“AllowInProcess”),不知道為什么不起作用?????,那好吧,我只好手動的勾上了。
7, 手動勾上允許進程內
8, 再次測試是否連通
從上面的這個圖可以看出,已經鏈接成功,SQL SERVER2012和ORACLE11G服務器之間的鏈接服務器已經建立成功。
五,下面我來測試如何在SQL SERVER2012里通過上面建立的鏈接服務器查詢ORACLE11G里的表數據。
1, 在ORACLE數據庫里建立一個測試表
2, 我用OPENQUERY來查詢ORACLE數據庫里的數據如下:
select * from openquery(ORACLE11G,'SELECT * FROM TESTLINKED_SERVER')
從上面可以看出,我查詢到了我再ORACLE數據庫里剛才建立的表和表數據信息。