Linked server和SSIS连接Oracle时的常见问题

来源:互联网 发布:js code style 编辑:程序博客网 时间:2024/05/22 05:26

引用:http://blogs.msdn.com/b/apgcdsd/archive/2011/05/25/linked-server-ssis-oracle.aspx

1.Linked server去连接oracle的时候,是按照SQL Server引擎的版本去载入oracle provider的版本。如果SQL Server64bit的,只能载入64 bit oracleprovider32bitSQL Server只能使用32bitoracleprovider

2.很多SQL Server图形界面工具都是32bit的,比如SSIS32位的 import/export wizard,这些32bit的工具只能load 32 bitoracle provider。如果想知道这个工具是不是32bit的,去检查工具所对应的exe文件是不是在program files(x86)子路径下。

3.Linked server连接oracle的时候,首先会读取tnsname.ora文件,然后读取sqlnet.ora文件,然后用SQLServr.exe直接去连oracle,连接成功以后会再次读取tnsname.ora文件,然后开始载入oracle OLEDBDLL文件。在64位操作系统上安装的32SQL Server中,读到的路径是这样的:

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.1.2.118)(PORT=1521))(CONNECT_DATA=(SID=express)(CID=(PROGRAM=D:\Program Files (x86)\Microsoft SQL Server\MSSQL.1\MSSQL\Binn\sqlservr.exe)(HOST=SCT-IT-SQLTEST)(USER=SYSTEM))))

64 bit的操作系统上按照32 bitSQL Server服务器以及32 bitoracle客户端,是可以创建linked serverSSIS程序包的。但是,oracle在处理包含括号文件全路径名称时有个bug,这个bug8i,9i10g的版本上都存在。必须通过打oracle的补丁来解决。

以下报错由Oracle bug引起(以下参考了官方定义关于此bug的文档):

主题:64Windows操作系统上运行32Oracle报错ORA-12154或者 ORA-6413

原文档 ID: 334528.1

症状:如果在64Windows操作系统上运行32Oracle客户端,自Windows平台使用ODBCOLEDBOO4OODP.NET四种接口之一尝试联接Oracle数据库时,将遇到以下报错信息

ORA-12154: TNS:could not resolve the connect identifier specified

或者

ORA-6413: Connection not open. Cause64-bit Microsoft OS's install 32-bit applications into the following location

"C:\Program Files (x86)\..."

rather than the typical location of

"C:\Program Files\..."

这将导致发生现有网络的错误,因为网络层无法解析程序地址中包含的可执行文件是试图连接到Oracle的路径括号。

这个bug已被提出来如下修正方案:

Bug 3807408 - CANNOT EXTERNALLY AUTHENTICATE USER WITH QUOTE IN USERNAME

更多信息

之所以遇到ORA-6413ORA-12154这是一般是取决于您选择用于连接到Oracle的编程接口。

错误ORA-12154是当使用最新的OCI接口连接时的典型错误,接口包括

Oracle ODBC Driver

Oracle Provider for OLE DB

Oracle Objects for OLE

Oracle Data Provider for .NET (ODP.NET)

Microsoft's .NET Managed Provider for Oracle

错误ORA-6413则是使用旧版本的接口,即调用Oracle OCI API 7版本的接口:

Microsoft ODBC Driver for Oracle

Microsoft OLE DB Provider for Oracle

解决方案有如下两种

解决1:

使用Oracle软件包含Bug 3807408补丁的版本

注意:目前为止已发布适用于Windows的补丁有:

Windows 32-bit

9.2.0.7.0 Patch 6: Apply Patch 4928723 or later

10.2.0.1.0 Patch 4: Apply Patch 4923768 or later

10.2.0.2.0 Patch 5: Apply Patch 5383042 or later

10.2.0.3.0: Apply Patch 5337014 or later

Windows 64-bit AMD64 and INTEL EM64T

10.2.0.1.0 Patch 4: Apply Patch 4923787 or later

10.2.0.2.0 Patch 5: Apply Patch 5388871 or later

10.2.0.3.0: Apply Patch 5337014 or later

对于其他版本的Windows平台请使用解决方案2

解决方案 2:

找到报错的应用程序路径,检查是否含有括号,如何有,请重新配置该应用到一个没有括号的路径中

4.如果使用64 bitSQL Server服务器和64 bitoracle 客户端,linked server是可以工作的。但是oracle64 bitOLEDB provider上有个bug,会导致连接服务器访问失败

报错信息如:Msg 7333, Level 16, State 2, Line 1

Cannot fetch a row using a bookmark from OLE DB provider "OraOLEDB.Oracle" for

linked server <linked server name>.

这个问题在32位环境下使用32 MSDAORA (Microsoft’s OLEDB Provider for Oracle) provider或者32-bit ORAOLEDB (Oracle’s OLEDB Provider) provider时不会发生。只发生在使用64-bit ORAOLEDB provider时(MSDAORA没有64位版本存在)。

这是一个与Oracle64OLEDB provider的已知问题。多数情况下,客户发生错误信息到Oracle或通过Oracle补丁或升级Oracle提供程序解决了这一问题。

最新64Oracle OLE DB provider版本是10.2.0.3.00.如果用户在使用低版本,升级即可解决。

对此问题Oracle正事补丁#5084517Oracle关于bug1023的前提补丁# 6166400也解决了早期部分用户的这一问题。看起来这些版本补丁都包含最新的Oracle provider

5.如果在一个64 位的SQL Server上想同时使用linked serverSSISBIDS去连oracle,必须要同时安装64位和32位的oracle客户端。但是,在oracle 10g早期的版本中,貌似有一个bug导致oracle 10g32 位和64位客户端无法同时在一台机器上工作。不确定这个问题是否已经被解决。目前11g32bit64bit Oracle客户端同时安装在一个机器上没有遇到这样的问题。

6. 32位上还可以使用oracleODBC driver创建ODBC数据源,然后在创建linked server时候使用Microsoft OLEDB for ODBC provider然后指向oracleODBC数据源。如果是64位的SQL Server 2005,默认安装是没有64bitMicrosoft OLEDB for ODBC provider的。需要去下载并安装64 Microsoft OLEDB for ODBC provider,然后就可以按照同样的方法使用oracleODBChttp://www.microsoft.com/downloads/details.aspx?FamilyID=000364db-5e8b-44a8-b9be-ca44d18b059b&displaylang=en

7.使用oracle ODBC provider比较容易遇到中文字符的问题,建议尽量使用OLEDBprovider

8. SQL Server对于oracle client OLEDBODBC的支持和test只到oracle 8.17的最后版本.这个版本中对于一些数据类型,比如blob字段是不支持的。如果使用9i以及后续版本的oracle client,不能保证在连接和使用中不遇到任何兼容性问题。任何兼容性问题,微软都不保证一定能解决方案。

9.对于oracle client 9i10g的版本,Microsoft .netoracle provider提供了兼容性支持。

原创粉丝点击