一、建立鏈接服務器
有人喜歡調用系統過程來建立,但我個人對系統過程沒有特別的學習 ,所以用的是界面設置,當然有興趣也可以研究一下的,因爲可以把SQL執行導出來。
如上,EXEC master.dbo.sp_addlinkedserver @server = N'TEST2', @srvproduct=N'ORCL', @provider=N'OraOLEDB.Oracle', @datasrc=N'TEST2' 是在系統裏建立鏈接。
注意,要建立鏈接之前,要在SQL數據庫所在服務器先安裝Oracle的客戶端,並配置好Oracle的實例連接。
@server = N'TEST2' 這個是參數設定鏈接服務器名稱。
@srvproduct=N'ORCL’ 這個參數是連接的Oracle的實例名稱。
@provider=N'OraOLEDB.Oracle' 這個參數是連接的驅動,Oracle10G以上裝了客戶端後重啓就可以在SQL裏找到。
@datasrc=N'TEST2' 這個參數是SQL數據庫所在電腦建立的Oracle連接的SID(不要與實例名搞混了,這個只是連接名。).
GO
EXEC master.dbo.sp_serveroption @server=N'TEST2', @optname=N'rpc', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'TEST2', @optname=N'rpc out', @optvalue=N'true'
這兩個是打開rpc,rpc out的,默認爲False,打開後可以支持遠程更改分佈式事務。只是用於查詢可以不設
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'TEST2', @locallogin = N'sa', @useself = N'False', @rmtuser = N'IFSAPP', @rmtpassword = N'IFSAPP'
GO
USE [master]
GO
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'TEST2', @locallogin = NULL , @useself = N'False', @rmtuser = N'IFSAPP', @rmtpassword = N'IFSAPP'
GO
這兩個執行是用來設定用於連接Oracle庫的用戶名及密碼,一般執行第一條就行了。但我喜歡把第二條也執行。用戶及密碼,很直觀,不多說了。
其它的直接可以默認了,沒什麼好說的。
二、查詢及更新鏈接服務器
建立了鏈接後,就可以用於讀取及變動,但語句與SQL還是有點區別的。
1)、查詢
格式1:select * from [鏈接服務器名]..[Oracle連接用戶名].[Oracle表名]
select * from TEST2..IFSAPP.table1
格式2:select * from OPENQUERY([鏈接服務器名],'PL/SQL 語句')
select * from OPENQUERY(TEST2,'select * from ifsapp.table1')
格式3:Exec("select * from [Oracle用戶].[表1]") AT [鏈接服務器名]
Exec("select * from ifsapp.table1") AT TEST2
2)、更改
格式1:
insert into openquery(TEST2,'select * from ifsapp.table1')
select cols1,cols2,... from SQLTable1;
格式2:
insert into openquery(TEST2,'select * from ifsapp.table1')
values ('cols1','cols2',...);
格式3:
update openquery(OERP,'select * from ifsapp.table1') set cols1= 'LEO',... where IKEY=4
格式4:Exec("update [Oracle用戶].[表1] set col1=xx where ikey=1") AT [鏈接服務器名]
Exec("update IFSAPP.table1 set col1=xx where ikey=1") AT TEST2
這個格式可以執行Oracle裏的存儲過程。
其實爲了方便,可以把上面的 select * from openquery(TEST2,'select* from ifsapp.table1) 建立成一個視圖,然後對視圖進行操作就可以了。
3)、執行存儲過程
使用OPENQUERY:
SELECT * FROM OPENQUERY(別名, ‘exec 用戶名.存儲過程名’)
三、鏈接服務器鏈接ORACLE時遇到“無法啓動分佈式事務”問題時
1. 雙方啓動MSDTC服務
MSDTC服務提供分佈式事務服務,如果要在數據庫中使用分佈式事務,必須在參與的雙方服務器啓動MSDTC(Distributed Transaction Coordinator)服務。
2. 打開雙方135端口
MSDTC服務依賴於RPC(Remote Procedure Call (RPC))服務,RPC使用135端口,保證RPC服務啓動,如果服務器有防火牆,保證135端口不被防火牆擋住。
使用"telnet IP 135 "命令測試對方端口是否對外開放。也可用端口掃描軟件(比如Advanced Port Scanner)掃描端口以判斷端口是否開放。
3. 保證鏈接服務器中語句沒有訪問發起事務服務器的操作
在發起事務的服務器執行鏈接服務器上的查詢、視圖或存儲過程中含有訪問發起事務服務器的操作,這樣的操作叫做環回(loopback),是不被支持的,所以要保證在鏈接服務器中不存在此類操作。
4. 在事務開始前加入set xact_abort ON語句
對於大多數 OLE DB 提供程序(包括 SQL Server),必須將隱式或顯示事務中的數據修改語句中的 XACT_ABORT 設置爲 ON。唯一不需要該選項的情況是在提供程序支持嵌套事務時。
5. MSDTC設置
打開"管理工具--組件服務",以此打開"組件服務--計算機",在"我的電腦"上點擊右鍵。在MSDTC選項卡中,點擊"安全配置"按鈕。
在安全配置窗口中做如下設置:
l 選中"網絡DTC訪問"
l 在客戶端管理中選中"允許遠程客戶端""允許遠程管理"
l 在事務管理通訊中選"允許入站""允許出站""不要求進行驗證"
l 保證DTC登陸賬戶爲:NT Authority/NetworkService
6.1 數據庫引擎
第一種情況的@server或者第二種情況的@datasrc設置爲ip地址時,數據庫引擎會根據ip地址訪問鏈接服務器,這時不需要做名稱解析。
第一種情況的@server或者第二種情況的@datasrc設置爲sql server服務器名時,需要做名稱解析,就是把服務器名解析爲ip地址。
有兩個辦法解析服務器名:
一是在sql server客戶端配置中設置一個別名,將上面的服務器名對應到鏈接服務器的ip地址。
二是在"C:/WINDOWS/system32/drivers/etc/hosts"文件中增加一條記錄:
xxx.xxx.xxx.xxx 服務器名
作用同樣是把服務器名對應到鏈接服務器的ip地址。
6.2 DTC
不管哪一種情況,只要@server設置的是服務器名而不是ip地址,就需要進行名稱解析,辦法同上面第二種辦法,在hosts文件中增加解析記錄,上面的第一種辦法對DTC不起作用。
如果@server設置的是ip地址,同樣不需要做域名解析工作。
7. 遠程服務器上的名稱解析
分佈式事務的參與服務器是需要相互訪問的,發起查詢的服務器要根據機器名或ip查找遠程服務器的,同樣遠程服務器也要查找發起服務器,遠程服務器通過發起服務器的機器名查找服務器,所以要保證遠程服務器能夠通過發起服務器的機器名訪問到發起服務器。
一般的,兩個服務器在同一網段機器名能就行很好的解析,但是也不保證都能很好的解析,所以比較保險的做法是:
在遠程服務器的在"C:/WINDOWS/system32/drivers/etc/hosts"文件中增加一條記錄:
xxx.xxx.xxx.xxx 發起服務器名
8.如果鏈接服務器鏈接的不是ORACLE,這樣處理基本可以的了,但如果是ORACLE,你會發現還是不可以的。錯誤依然。這其實跟MSDTC已沒有關係了。是ORACLE本身不支持外部啓動分佈式事務,要解決這個問題,經過找ORACLE官網,他要加一個叫ODAC的補丁,支持分佈式事務的一個數據庫連接包。
Oracle數據庫客戶端訪問組件下載地址:
http://www.oracle.com/technology/software/tech/windows/odpnet/index.html
不同的ORACLE版本有對應的不同補丁,選擇下載就可以了。
安裝好這個補丁後,你再寫如:
set xact_abort on --(這一句必要,不然會報錯)
Begin TRAN
update [鏈接服務器名]..[Oracle用戶名].[Table] set col1='new value'...
IF @@ERROR<>0
ROLLBACK TRAN;
ELSE
COMMIT TRAN;
語句成功!
有時更新會報找不到列等的錯誤,可以轉換上面提到的幾種格式看看,有些格式並不支持一些特別的功能。
至此,纔是真正的成功!
四、如果是報"無法初始化鏈接服務器 "null" 的 OLE DB 訪問接口 "OraOLEDB.Oracle" 的數據源對象"
這是因爲你的新安裝的訪問接口OraOLEDB.Oracle沒有打開允許操作。重新配置:鏈接服務器->訪問接口->OraOLEDB.Oracle->右鍵屬性,選中 "Allow inprocess" (中文爲:允許進程內)
這個問題解不決。