在64位SQL Server中創建Oracle的鏈接服務器 Link Server


有時候我們希望在一個sqlserver下訪問另一個sqlserver數據庫上的數據,或者訪問其他oracle數據庫上的數據,要想完成這些操作,我們首要的是創建數據庫鏈接。
數據庫鏈接能夠讓本地的一個sqlserver登錄用戶映射到遠程的一個數據庫服務器上,並且像操作本地數據庫一樣。

SQL Server Link Server
使用MS SQL Server 提供的Linked Server建立對其他異構數據庫服務器的單向信任連接,實現數據傳輸。
支持Distribution Transaction, 效能較好,但存在平台限制,連接僅能設置在SQL Server端,使用較透明。
使用時SQL語法與常用方法差別很小,很利於開發人員快速適應使用。

適合同時使用以SQL Server為主的多種數據庫且有數據關聯的項目,使用教透明,在開發中基本不必考慮異
構數據庫的影響,且能提供完善的事務支持。

 

 

一、Oracle數據訪問組件ODAC的安裝方法  -----安裝驅動

 注意:安裝驅動的目的是讓SQLSERSSVER中數據源有Oracle provider for OLD DB,MSSQL2008默認是自帶這個驅動,以下是無需安裝的(否則會提示未注冊之類的錯誤)

方一:
如果用32位win2003操作系統,會有系統自帶的Microsoft OLE DB Provider for Oracle驅動,因此不需要做額外的准備工作,但如果使用的是64位系統,那么這個驅動是沒有的,並且微軟也不提供這個驅動的64位版本,因此,此時只能使用Oracle提供的Oracle Provider for OLE DB這個驅動。
安裝一個完整的Oracle11gR2程序也是一個有效的方法,但這個64位版本的安裝包有2個多G,相當龐大,如果僅僅是為了建立鏈接服務器,完全沒必要裝這么個龐然大物。其實我們只需要到Oracle官網上下載ODAC壓縮包即可。
方一:
下載地址http://www.oracle.com/technetwork/topics/dotnet/utilsoft-086879.html
我下載的是ODAC 11.2 Release 4 and Oracle Developer Tools for Visual Studio (11.2.0.3.0)

 

 

本文采取方二

方二:到百度空間中下載64-bit ODAC 11.2 Release 6 (11.2.0.4.0) Xcopy for Windows x64,安裝包名為ODAC112040Xcopy_64bit.zip

1.解壓縮這個zip包,把里面的文件都解壓到一個文件夾里,我是解壓到D:\ODAC112040Xcopy_64bit,然后打開cmd,進入到這個文件夾。
這個文件夾里有8個子文件夾,分別是:
instantclient_11_2:這是Oracle客戶端,所有組件的運行都依賴於這個客戶端;  是最基礎的
oledb:這是OLE DB組件
asp.net:這是ASP.NET2組件
asp.net4:這是ASP.NET4組件
odp.net4:這是.NET4組件
odp.net20:這是.NET2組件
oramts:這是Oracle的MTS服務
network:這個文件夾不用管,它是用來存放tnsnames.ora文件的,要安裝后才能用。

組件之間的依賴關系。:

instantclient_11_2是最基礎的
oledb依賴於instantclient_11_2
asp.net依賴於instantclient_11_2和odp.net20
asp.net4依賴於instantclient_11_2和odp.net4
odp.net4依賴於instantclient_11_2
odp.net20依賴於instantclient_11_2
oramts依賴於instantclient_11_2

 

2.安裝ODAC包 ,(安裝后SQL SERVSER中就會多了一個數據源Oracle provider for OLD DB

在cmd中運行install.bat批處理文件:輸入"install.bat all D:\OracleClient ODAC"(不含雙引號)。這里有幾個參數需要特別注意,這里我們傳入了三個參數,但最多可以傳入四個。

第一個參數:all。all代表安裝ODAC112040Xcopy_64bit文件夾下所有的組件和客戶端。如果你不需要這么多組件,只用到其中一個,比如只用到了OLE DB組件,就可以像下面這樣只安裝客戶端和這一個OLE DB組件: install.bat oledb D:\OracleClient ODAC

第二個參數:D:\OracleClient。這是安裝路徑,根據自己的實際情況指定,路徑中盡量不要有空格和圓括號。

第三個參數:ODAC。這個叫ORACLE HOME NAME,這個參數也可以自己隨便指定一個字符串,不一定非得是"ODAC"。這個參數是用來寫入注冊表的。比如,上面這條語句執行后,會在注冊表的以下位置寫入: HKLM\Software\Oracle\KEY_ODAC 這"KEY_"后面的ODAC就是你在參數中傳入的那個"ODAC"

第四個參數。一般只用前三個參數就夠了,在安裝組件的時候會自動把它依賴的組件都安裝上,但如果你只想安裝指定的組件,不想裝它所依賴的組件,這時才會用到第四個參數。比如:當你安裝asp.net時,如果只用前三個參數,會自動把它所依賴的odp.net20和instantclient_11_2也安裝上,但如果你再傳入第四個參數"false",如下:install.bat asp.net D:\OracleClient ODAC false 這時就只會安裝asp.net,而不會把odp.net20和instantclient_11_2也裝上。

 

3.設置環境變量

ORACLE_HOME=D:\OracleClient (添加一個環境變量ORACLE_HOME,其值為你的安裝路徑,比如我這里就是D:\OracleClient)

PATH=%ORACLE_HOME%;%ORACLE_HOME%\bin; (在PATH環境變量中添加下面兩個路徑,用分號隔開: %ORACLE_HOME%;%ORACLE_HOME%\bin;)

 

 

二、根據需要配置tnsnames.ora文件

前提安裝ORACLE 11 64位 client

如果要用組件訪問Oracle數據庫,那么就要根據需要配置tnsnames.ora文件,並存放於%ORACLE_HOME%\network\admin目錄下。 我的tnsnames.ora文件格式如下,供參考:

NALGENE =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.1.127)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = nalgene)
    )
  )

 

 

三、在64位SQL Server中創建Oracle的鏈接服務器

注意以下數據源填寫的是tnsname.ora文件中左上角的參數名,而不是紅色框中的名字

 

 

 

運行效果如下

 

 

 

創建一個sqlserver對Oracle的數據庫鏈接:

create view vvv as select * from TESTORACLE..SCOTT.SYS_USER
 select * from vvv;
其中SCOTT為遠程oracle數據庫服務器的一個用戶名,SYS_USER為該用戶在該服務器上的一個表,要非常注意的是:數據庫鏈接(TESTORACLE)后面有兩個點(..),再往后面必須全部大寫,查詢的對象一般為表格或者視圖,不能查詢同義詞。

-- 1.配置LinkServer語句如下(鏈接服務器為Oracle,使用oracle的oledb庫MSDAORA)
--
1.1為建立鏈接服務器
EXEC master.dbo.sp_addlinkedserver 
@server  = N ' TESTORACLE '   -- 要創建的鏈接服務器名稱
@srvproduct =N ' ORACLE '   -- 產品名稱
@provider =N ' OraOLEDB.Oracle '   -- OLE DB 字符  
@datasrc =N ' SEINESCM_97 '   -- 數據源


-- 1.2為創建連接服務器登陸
EXEC master.dbo.sp_addlinkedsrvlogin 
@rmtsrvname =N ' TESTORACLE '
, @useself =N ' False '
, @locallogin = NULL
, @rmtuser =N ' SYSTEM '
, @rmtpassword = ' ######## '

GO


-- 1.3為設置鏈接服務器屬性
exec sp_serveroption  @server = ' TESTORACLE ',
                      @optname  =  ' rpc ',       -- 從給定的服務器啟動rpc
                      @optvalue  = ' true '       -- 這樣可以調用遠程的存儲過程
 
exec sp_serveroption  @server = ' TESTORACLE ',
                      @optname  =  ' rpc out ',   -- 對給定的服務器啟動rpc 
                      @optvalue  = ' true '       -- 在遠程執行DDL語句


-- 2.執行操作語句如下方一:
select  *  from TESTORACLE..SCOTT.EMP
-- 將ORACLE數據插入到SQLSERSVER
select  *  into aaa   from TESTORACLE..SCOTT.EMP
-- 往ORALCE插入數據
insert  into  TESTORACLE..SCOTT.EMP  values( 9999, ' ename ', ' job ', 888, getdate(), 10000, 1000, 20)
update  TESTORACLE..SCOTT.EMP  set empno = 8888  where empno = 9999
delete  from  TESTORACLE..SCOTT.EMP  where empno = 8888

-- 如下語法創建表出錯 對象 名稱 'TESTORACLE..SCOTT.EMP2' 包含的前綴超出了最大限值。最多只能有 2 個。
create  table TESTORACLE..SCOTT.EMP2(iddd  number)
-- 使用如下語法才可以創建表
exec( ' create table SCOTT.EMP2(iddd number) ') at  [ TESTORACLE ]

-- 創建視圖
create  view v_test  as  select  *  from TESTORACLE..SCOTT.EMP
select  *  from v_test


-- 3.執行操作語句如下方二:
--
3.1為在遠程服務器上執行DDL語句新建表,用oracle的方式書寫語句
exec( ' create table STG.TEST(iddd number) ') at  [ TESTORACLE ]

-- 3.2為opendatasource函數,查詢一下oracle中的數據 ok
select  *  from  openquery( [ TESTORACLE ], ' select * from STG.TEST ')
-- 等待於
select  *  from TESTORACLE..SCOTT.EMP

select  * 
from 
opendatasource( ' OraOLEDB.Oracle ', ' Data Source=SEINESCM_97;
                          User ID=scott;
                          password=scott
')..SCOTT.TEST


-- 3.3用openrowset函數,把oracle的數據直接新建表的同時插入數據
select  * 
INTO EMP_X 
from  openrowset( ' OraOLEDB.Oracle ', ' SEINESCM_97 '; ' scott '; ' scott ',SCOTT.EMP)
 
select  * 
INTO EMP_X 
from  openrowset( ' OraOLEDB.Oracle ', ' SEINESCM_97 '; ' scott '; ' scott ', ' select * from SCOTT.EMP ')

 

 

有人反應64bit系統安裝ODAC要安裝32bit版本(即oracle 11g Client 為32bit的),否則會出現ODAC無法使用狀況。但我測試是沒問題的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM