如何在 SQL 服务器中设置到 Oracle 的链接服务器并进行故障排除

 

重要说明:本文包含有关如何修改注册表的信息。修改注册表之前,一定要先进行备份,并且一定要知道在发生问题时如何还原注册表。有关如何备份、还原和修改注册表的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
256986  (http://support.microsoft.com/kb/256986/ ) Microsoft Windows 注册表说明

本页

概要
本文分步介绍了如何设置从运行 Microsoft SQL Server 的计算机到 Oracle 数据库的链接服务器,还针对您在设置到 Oracle 的链接服务...

本文分步介绍了如何设置从运行 Microsoft SQL Server 的计算机到 Oracle 数据库的链接服务器,还针对您在设置到 Oracle 的链接服务器时可能遇到的常见错误提供了基本的故障排除步骤。

设置到 Oracle 的链接服务器的步骤

  1. 您必须在运行要在其上设置链接服务器的 SQL Server 计算机上安装 Oracle 客户端软件。
  2. 在运行 SQL Server 的计算机上安装所需的驱动程序。Microsoft 仅支持用于 Oracle 的 Microsoft OLE DB 提供程序和 Microsoft ODBC 驱动程序。如果您使用第三方提供程序或第三方驱动程序连接到 Oracle,则在使用这些提供程序或驱动程序遇到任何问题时,您必须与相应的供应商联系。
  3. 如果您使用用于 Oracle 的 Microsoft OLE DB 提供程序和 Microsoft ODBC 驱动程序,请考虑下列事项:
    • 随 Microsoft Data 数据访问组件 (MDAC) 提供的 OLE DB 提供程序和 ODBC 驱动程序和都需要 SQL*Net 2.3.x 或更高版本。您必须在客户端计算机上安装 Oracle 7.3.x 客户端软件或更高版本。客户端计算机是运行 SQL Server 的计算机。
    • 确保您已经在运行 SQL Server 的计算机上安装了 MDAC 2.5 或更高版本。如果使用 MDAC 2.1 或更早版本,则无法连接到使用 Oracle 8.x 或更高版本的数据库。
    • 要使 MDAC 2.5 或更高版本能够与 Oracle 客户端软件一起工作,必须按照下表中的说明修改运行 SQL Server 的客户端计算机的注册表。
      		Microsoft Windows NT、
      Oracle		Microsoft Windows 95、
      Client		Windows 98 和 Windows 98 SE       Microsoft Windows 2000 
      --------------------------------------------------------------------------
      
      7.x        	[HKEY_LOCAL_MACHINE\SOFTWARE     [HKEY_LOCAL_MACHINE\SOFTWARE  
      		\Microsoft\TransactionServer     Microsoft\MSDTC\MTxOCI]
      		\Local Computer\My Computer]     "OracleXaLib"="xa73.dll"
      		"OracleXaLib"="xa73.dll"         "OracleSqlLib"="SQLLib18.dll"
      		"OracleSqlLib"="SQLLib18.dll"    "OracleOciLib"="ociw32.dll"
      		"OracleOciLib"="ociw32.dll"   
      
      8.0		[HKEY_LOCAL_MACHINE\SOFTWARE     [HKEY_LOCAL_MACHINE\SOFTWARE
      		\Microsoft\Transaction Server    \Microsoft\MSDTC\MTxOCI]
      		\Local Computer\My Computer]     "OracleXaLib"="xa80.dll"
      		"OracleXaLib"="xa80.dll"         "OracleSqlLib"="sqllib80.dll" 
      		"OracleSqlLib"="sqllib80.dll"    "OracleOciLib"="oci.dll"
      		"OracleOciLib"="oci.dll" 
      
      8.1		[HKEY_LOCAL_MACHINE\SOFTWARE     [HKEY_LOCAL_MACHINE\SOFTWARE
      		\Microsoft\Transaction Server    \Microsoft\MSDTC\MTxOCI]
      		\Local Computer\My Computer]     "OracleXaLib"="oraclient8.dll" 
      		"OracleXaLib"="oraclient8.dll"   "OracleSqlLib"="orasql8.dll"  
      		"OracleSqlLib"="orasql8.dll"     "OracleOciLib"="oci.dll"
      		"OracleOciLib"="oci.dll"
  4. 安装 Oracle 客户端软件之后,请重新启动运行 SQL Server 的计算机。
  5. 在运行 SQL Server 的计算机上,使用以下脚本设置链接服务器。
    -- Adding linked server (from SQL Server Books Online):
    /* sp_addlinkedserver [@server =] 'server' 
        [, [@srvproduct =] 'product_name']
        [, [@provider =] 'provider_name'] 
        [, [@datasrc =] 'data_source'] 
        [, [@location =] 'location'] [, [@provstr =] 'provider_string'] 
        [, [@catalog =] 'catalog']
    */ 
    
    EXEC sp_addlinkedserver   'Ora817Link',  'Oracle',  'MSDAORA',  'oracle817'
    
    -- Adding linked server login:
    /* sp_addlinkedsrvlogin [@rmtsrvname =] 'rmtsrvname'
        [,[@useself =] 'useself']
        [,[@locallogin =] 'locallogin']
        [,[@rmtuser =] 'rmtuser']
        [,[@rmtpassword =] 'rmtpassword']
    */ 
    
    EXEC sp_addlinkedsrvlogin 'Ora817Link', 'FALSE',NULL, 'scott', 'tiger'
    
    -- Help on the linked server:
    EXEC sp_linkedservers
    EXEC sp_helpserver
    select * from sysservers
注意:如果使用用于 Oracle 的 Microsoft ODBC 驱动程序,则可以使用 @datasrc 参数指定 DSN 名称。对于无 DSN 的连接,则通过 @provstr 参数提供提供程序字符串。如果使用用于 Oracle 的 Microsoft OLE DB 提供程序,则请将 TNSNames.Ora 文件中配置的 Oracle 服务器别名用于 @datasrc 参数。有关更多信息,请参见 SQL Server 联机丛书中的“sp_addlinkedserver”主题。

常见错误信息及如何对这些错误信息进行故障排除

警告:如果使用注册表编辑器或其他方法错误地修改了注册表,则可能导致严重问题。这些问题可能需要重新安装操作系统才能解决。Microsoft 不能保证您可以解决这些问题。修改注册表需要您自担风险。

要检索有关在执行分布式查询时遇到的错误的扩展信息,可以使用下面两种方法之一。
  • 方法 1
    在查询分析器中,运行下面的代码以打开跟踪标志 7300。
    DBCC Traceon(7300)
  • 方法 2
    捕获在 SQL 事件探查器的“错误和警告”事件类别中找到的“OLEDB 错误”事件。错误信息的格式如下:
    Interface::Method failed with hex-error code.
    您可以在 MDAC 软件开发工具包 (SDK) 中附带的 Oledberr.h 文件中查找十六进制错误代码。
下面列出了可能发生的十个常见错误信息以及如何对这些错误信息进行故障排除的方法。

注意:有关与性能相关的问题,请搜索 SQL Server 联机丛书中的“Optimizing Distributed Queries”(优化分布式查询)主题。
  • 消息 1
    Error 7399:OLE DB provider '%ls' reported an error.%ls
    打开跟踪标志 7300,或使用 SQL 事件探查器捕获“OLEDB 错误”事件,以便检索扩展的 OLEDB 错误信息。
  • 消息 2a
    "ORA-12154:TNS:could not resolve service name"
    消息 2b
    "The Oracle(tm) client and networking components were not found.These components are supplied by Oracle Corporation and are part of the Oracle Version 7.3.3 (or greater) client software installation"
    有关如何解决 Oracle 连接问题的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
    259959  (http://support.microsoft.com/kb/259959/ ) INFO:对使用 ODBC 驱动程序和 OLE DB 提供程序的 Oracle 服务器调试连接问题的技术
  • 消息 3
    Error 7302:Could not create an instance of OLE DB provider 'MSDAORA'
    请确保正确注册了 MSDAORA.dll 文件。(MSDAORA.dll 文件是用于 Oracle 文件的 Microsoft OLE DB 提供程序。)使用 RegSvr32.exe 注册用于 Oracle 的 Microsoft OLE DB 提供程序。如果注册失败,请重新安装 Microsoft 数据访问组件 (MDAC)。有关 MDAC 的更多信息,请访问下面的 Microsoft Developer Network (MSDN) 网站:
    http://msdn.microsoft.com/data/Default.aspx (http://msdn.microsoft.com/data/Default.aspx)
    注意:如果您使用第三方程序,而该 Oracle 提供程序无法在 SQL Server 进程外运行,请更改提供程序选项使它在进程内运行。要更改提供程序选项,请使用下列方法之一。
    • 方法 1
      找到下面的注册表项。然后,将 AllowInProcess (DWORD) 项的值更改为 1。此注册表项位于相应的提供程序名称下:
      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Providers\ProviderName
    • 方法 2
      在添加新的链接服务器时,通过 SQL Server 企业管理器直接设置允许 InProcess 选项。单击提供程序选项,然后单击以选中允许 InProcess 复选框。
  • 消息 4
    Error 7303:Could not initialize data source object of OLE DB provider 'MSDAORA'.[OLE/DB provider returned message:ORA-01017:invalid username/password; logon denied] OLE DB error trace [OLE/DB Provider 'MSDAORA' IDBInitialize::Initialize returned 0x80040e4d].
    该错误信息表明链接服务器没有正确的登录映射。您可以执行 sp_helplinkedsrvlogin 存储过程来正确设置登录信息。此外请验证您是否已为链接服务器配置指定了正确的参数。
  • 消息 5
    Error 7306:Could not open table ' %ls' from OLE DB provider 'MSDAORA'.The specified table does not exist.[OLE/DB provider returned message:Table does not exist.][OLE/DB provider returned message:ORA-00942:table or view does not exist] OLE DB error trace [OLE/DB Provider 'MSDAORA' IOpenRowset::OpenRowset returned 0x80040e37:The specified table does not exist.].
    Error 7312:Invalid use of schema and/or catalog for OLE DB provider '%ls'.A four-part name was supplied, but the provider does not expose the necessary interfaces to use a catalog and/or schema.
    Error 7313:Invalid schema or catalog specified for provider '%ls'.
    Err 7314:OLE DB provider '%ls' does not contain table '%ls'
    如果收到上述错误信息,则表明 Oracle 架构中可能缺少一个表,或者您在该表上可能没有权限。请验证是否使用大写形式键入架构名称。表和列的字母大小写情况应与 Oracle 系统表中指定的一样。

    在 Oracle 端,未使用双引号创建的表或列以大写形式存储。如果用双引号将表或列引起来,则表或列按原样存储。

    下面的调用显示了 Oracle 架构中是否存在表。此调用还显示了确切的表名。
    sp_tables_ex  @table_server=Ora817Link, @table_schema='your_schema_name'
    有关错误信息 7306 的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
    240340  (http://support.microsoft.com/kb/240340/ ) PRB:对 Oracle 进行 SQL 分布式查询导致“Could not open table”(未能打开表)错误
  • 消息 6
    Error 7413:Could not perform a Windows NT authenticated login because delegation is not available.
    Msg 18456, Level 14, State 1, Line 1 Login failed for user '\'.
    以下信息摘自 SQL Server 联机丛书:
    该错误信息表明,在没有显式的登录映射的情况下,您试图对 Microsoft Windows 验证登录执行分布式查询。在不支持安全委派的操作系统环境中,Windows NT 验证登录需要显式映射到使用 sp_addlinkedsrvlogin 创建的远程登录帐户和密码。
  • 消息 7
    Error 7354:OLE DB provider 'MSDAORA' supplied invalid metadata for column '%ls'.The data type is not supported.
    如果收到此错误信息,您可能会遇到在下面的 Microsoft 知识库文章中描述的问题:
    243027  (http://support.microsoft.com/kb/243027/ ) FIX:Oracle 中的数字列导致错误 7354
  • 消息 8
    Error 7356:OLE DB provider 'MSDAORA' supplied inconsistent metadata for a column.Metadata information was changed at execution time.
    如果您的链接服务器查询使用 Oracle 视图,您可能会遇到下面的 Microsoft 知识库文章中描述的问题:
    251238  (http://support.microsoft.com/kb/251238/ ) PRB:分布式查询返回错误 7356 及 MSDAORA
  • 消息 9
    Error 7391:The operation could not be performed because the OLE DB provider 'MSDAORA' does not support distributed transactions.OLE DB error trace [OLE/DB Provider 'MSDAORA' ITransactionJoin::JoinTransaction returned 0x8004d01b]
    验证 OCI 版本是否已按上文描述的那样正确注册。

    注意:如果注册表项全都正确,将会加载 MtxOCI.dll 文件。如果 MtxOCI.dll 未加载,则您无法使用用于 Oracle 的 Microsoft OLE DB 提供程序或 Microsoft ODBC 驱动程序对 Oracle 执行分布式事务。如果您正在使用第三方提供程序并且收到错误 7391,请验证您正在使用的 OLE DB 提供程序是否支持分布式事务。如果 OLE DB 提供程序确实支持分布式事务,请验证 Microsoft 分布式事务协调器 (MSDTC) 正在运行。
  • 消息 10
    Error 7392:Could not start a transaction for OLE DB provider 'MSDAORA'.OLE DB error trace [OLE/DB Provider 'MSDAORA' ITransactionLocal::StartTransaction returned 0x8004d013:ISOLEVEL=4096].
    以下信息摘自 SQL Server 联机丛书:
    OLE DB 提供程序返回错误 7392,因为对于此会话只能有一个事务处于活动状态。该错误表明,在连接处于显式或隐式事务中,且 OLE DB 提供程序不支持嵌套事务时,您试图对 OLE DB 提供程序执行数据修改语句。SQL Server 需要这种支持,以便在某些错误情况下,它可以终止数据修改语句的影响,同时继续进行事务处理。
    如果 SET XACT_ABORT 为 ON,则 SQL Server 不需要 OLE DB 提供程序中的嵌套事务支持。因此,在显式或隐式事务中对远程表执行数据修改语句之前,请将 SET XACT_ABORT 设为 ON。这样做的目的是为了防止您正在使用的 OLE DB 提供程序不支持嵌套事务。

参考
有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章: 244661  (http://support.microsoft.com...

有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
244661  (http://support.microsoft.com/kb/244661/ ) INFO:Microsoft Oracle ODBC 驱动程序和 OLE DB 提供程序的局限性
259959  (http://support.microsoft.com/kb/259959/ ) INFO:对使用 ODBC 驱动程序和 OLE DB 提供程序的 Oracle 服务器调试连接问题的技术
239719  (http://support.microsoft.com/kb/239719/ ) INFO:用于 Oracle w.r.t Oracle 8.x 的 Microsoft ODBC 驱动程序/OLE DB 提供程序的支持性
193893  (http://support.microsoft.com/kb/193893/ ) 关于与 Microsoft Transaction Server 和 COM+ 组件一起使用 Oracle 的信息
191168  (http://support.microsoft.com/kb/191168/ ) INFO:错误“-2147168246 (8004d00a)”无法登记调用对象的事务
有关如何将链接服务器与 DB2 一起使用的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
218590  (http://support.microsoft.com/kb/218590/ ) INF:为用于 DB2 的 Microsoft OLE DB 提供程序配置数据源
216428  (http://support.microsoft.com/kb/216428/ ) 配置用于 DB2 的 Microsoft ODBC 驱动程序
posted @ 2009-09-25 14:24  行进中开火  阅读(1728)  评论(0编辑  收藏  举报