在 SQL Server 中设置链接服务器并将其故障排除

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

原始产品版本:Microsoft SQL Server 2005 标准版、Microsoft SQL Server 2005 Developer Edition、Microsoft SQL Server 2005 企业版、Microsoft SQL Server 2005 Express Edition、Microsoft SQL Server 2005 Workgroup Edition
原始 KB 数: 280106

总结

本文介绍如何将链接服务器从运行 Microsoft SQL Server 的计算机设置为 Oracle 数据库,并提供在将链接服务器设置为 Oracle 时可能会遇到的常见错误的基本故障排除步骤。 本文中的大部分信息都适用于配置为使用适用于 Oracle 的 OLEDB 提供程序Microsoft的环境(MSDAORA)。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。 请改用 Oracle 的 OLE DB 提供程序。

若要详细了解如何使用 Oracle 的 OLEDB 提供程序配置链接服务器,请查看 如何使用 Oracle 和链接服务器启动和运行。

重要

Microsoft ODBC Driver for Oracle 的当前版本符合 ODBC 2.5 规范,而 OLE DB Provider for Oracle 是本机 Oracle 7 OCI API 提供程序。 驱动程序和提供程序都使用 SQL*Net 客户端(或适用于 Oracle 8x 的 Net8 客户端)和 Oracle 调用接口(OCI)库和其他 Oracle 客户端组件连接到 Oracle 数据库并检索数据。 Oracle 客户端组件非常重要,必须正确配置才能使用驱动程序和提供程序成功连接到 Oracle 数据库。

从 Microsoft 数据访问组件 (MDAC) 版本 2.5 及更高版本,Microsoft ODBC 驱动程序和 OLE DB 提供程序都支持仅 Oracle 7 和 Oracle 8i,但具有以下限制:

  • 不支持 Oracle 8.x 特定的数据类型,例如 CLOB、BLOB、BFILE、NCHAR、NCLOB 和 NVARCHAR2。

  • 不支持针对 Oracle 7.x 和 8.x 服务器的 Unicode 功能。

  • 不支持多个 Oracle 客户端实例或多个 Oracle 家庭,因为它们依赖于 SYSTEM PATH 变量中 Oracle 主实例的第一个匹配项。

  • 不支持使用 ADO 或 OLEDB 从存储过程或批处理 SQL 语句返回多个结果集。

  • 不支持嵌套外部联接。

  • 不支持 XML 持久性。

  • 使用这些驱动程序不支持大于 8i 的版本。

注意

本文中讨论的第三方产品由 Microsoft 以外的其他公司提供。 对于这些产品的性能或可靠性,Microsoft 不作任何暗示保证或其他形式的保证。

将链接服务器设置为 Oracle 的步骤

  1. 必须在运行设置了链接服务器的 SQL Server 的计算机上安装 Oracle 客户端软件。

  2. 在运行 SQL Server 的计算机上安装所需的驱动程序。 Microsoft仅支持 Oracle 的 Microsoft OLE DB 提供程序 和 Microsoft ODBC Driver for Oracle。 如果使用第三方提供商或第三方驱动程序连接到 Oracle,则必须联系相应的供应商,以了解使用其提供商或驱动程序可能会遇到的任何问题。

  3. 如果使用 Oracle 的 Microsoft OLE DB 提供程序 和 Microsoft ODBC Driver for Oracle,请考虑以下事项:

    • Microsoft数据访问组件(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 的客户端计算机上修改注册表,如下表所示。

      Oracle
      Client               Microsoft Windows 2000 and later versions
      --------------------------------------------------------------------------
      
      7.x                  [HKEY_LOCAL_MACHINE\SOFTWARE
                           Microsoft\MSDTC\MTxOCI]
                           "OracleXaLib"="xa73.dll"
                           "OracleSqlLib"="SQLLib18.dll"
                           "OracleOciLib"="ociw32.dll"
      
      8.0                  [HKEY_LOCAL_MACHINE\SOFTWARE
                           \Microsoft\MSDTC\MTxOCI]
                           "OracleXaLib"="xa80.dll"
                           "OracleSqlLib"="sqllib80.dll"
                           "OracleOciLib"="oci.dll"
      
      8.1                  [HKEY_LOCAL_MACHINE\SOFTWARE
                           \Microsoft\MSDTC\MTxOCI]
                           "OracleXaLib"="oraclient8.dll"
                           "OracleSqlLib"="orasql8.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
    

    注意

    如果使用 Microsoft ODBC Driver for Oracle,则可以使用 @datasrc 参数指定 DSN 名称。 对于无 DSN 连接,提供程序字符串通过 @provstr 参数提供。 对于Oracle 的 Microsoft OLE DB 提供程序,请使用在 TNSNames.Ora 文件中配置的 Oracle 服务器别名,以便@datasrc参数。 有关详细信息,请参阅 SQL Server 联机丛书中的“sp_addlinkedserver”主题。

常见错误消息以及如何对其进行故障排除

重要

此部分(或称方法或任务)介绍了修改注册表的步骤。 但是,注册表修改不当可能会出现严重问题。 因此,按以下步骤操作时请务必谨慎。 作为额外保护措施,请在修改注册表之前先将其备份。 如果之后出现问题,您就可以还原注册表。 有关如何备份和还原注册表的详细信息,请单击以下文章编号以查看Microsoft知识库中的文章: 322756 如何在 Windows 中备份和还原注册表

可以使用以下两种方法之一来检索有关执行分布式查询时遇到的任何错误的扩展信息。

  • 方法 1

    使用 SQL Server Management Studio 连接到 SQL Server,并运行以下代码以打开跟踪标志 7300。

    DBCC Traceon(7300)
    
  • 方法 2

    捕获 SQL Profiler 中“错误和警告”事件类别中的“OLEDB 错误”事件。 错误消息格式如下:

    Interface::Method failed with hex-error code.

    可以在 MDAC 软件开发工具包(SDK)随附的 Oledberr.h 文件中查找十六进制错误代码。

下面是可能出现的常见错误消息列表,以及有关如何排查错误消息的信息。

注意

如果使用 SQL Server 2005 或更高版本,则这些错误消息可能略有不同。 但是,这些错误消息的错误 ID 与旧版 SQL Server 中的错误 ID 相同。 因此,可以通过错误 ID 标识它们。 有关性能相关问题,请在 SQL Server 联机丛书中 搜索“优化分布式查询 ”主题。

  • Message 1

    错误 7399:链接服务器“%ls”的 OLE DB 访问接口“%ls”报告了错误。 %ls

    打开跟踪标志 7300 或使用 SQL 探查器捕获 OLEDB 错误 事件以检索扩展的 OLEDB 错误信息。

  • 消息 2a

    “ORA-12154:TNS:无法解析服务名称”

  • 消息 2b

    “找不到 Oracle(tm) 客户端和网络组件。 这些组件由 Oracle Corporation 提供,是 Oracle 版本 7.3.3(或更高版本)客户端软件安装的一部分”

    当与 Oracle 服务器发生连接问题时,会发生这些错误。 查看 以下用于排查 Oracle 服务器 连接问题的技术,了解其他故障排除。

  • Message 3

    错误 7302:无法为链接服务器“%ls”创建 OLE DB 提供程序“MSDAORA”实例。

    确保正确注册MSDAORA.dll文件。 (MSDAORA.dll文件是 oracle 文件的 Microsoft OLE DB 访问接口。使用RegSvr32.exe注册Oracle 的 Microsoft OLE DB 提供程序。

    注意

    如果使用第三方 Oracle 提供程序,并且 Oracle 提供程序不能在 SQL Server 进程外部运行,请通过更改提供程序选项来启用它以运行进程内。 若要更改提供程序选项,请使用以下方法之一:

    • 方法 1 找到以下注册表项。 然后,将 AllowInProcess (DWORD) 条目的值更改为 1。 此注册表项位于相应的提供程序名称下: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Providers\ProviderName

    • 方法 2 按照以下步骤为使用 SQL Server Management Studio(SSMS)的提供程序设置 “允许进程 内”选项。

    1. 打开 SSMS 并连接到 SQL Server 实例。
    2. 对象资源管理器中,导航到“服务器对象>链接服务器>提供程序”。
    3. 右键单击要配置的提供程序,然后选择“ 属性”。
    4. “提供程序选项”窗口中,选中“允许进程内”选项的“启用”框。
  • 消息 4

    错误 7303:无法初始化链接服务器“%ls”的 OLE DB 访问接口“MSDAORA”的数据源对象。 [OLE/DB 提供程序返回的消息:ORA-01017:用户名/密码无效;登录被拒绝]OLE DB 错误跟踪 [OLE/DB 提供程序'MSDAORA' IDBInitialize::Initialize 返回0x80040e4d]。

    此错误消息指示链接服务器没有正确的登录映射。 可以执行 sp_helplinkedsrvlogin 存储过程来正确设置登录信息。 此外,请验证是否已为链接服务器配置指定了正确的参数。

  • 消息 5

    错误 7306:无法从链接服务器“%ls”的 OLE DB 访问接口'MSDAORA'打开表 '%ls'。 指定的表不存在。 [OLE/DB 提供程序返回的消息:表不存在。][OLE/DB 提供程序返回的消息:ORA-00942:表或视图不存在]OLE DB 错误跟踪 [OLE/DB 提供程序“MSDAORA”IOpenRowset::OpenRowset 返回0x80040e37:指定的表不存在。]。

    错误 7312:链接服务器“%ls”对 OLE DB 访问接口 '%ls' 使用架构和/或目录无效。 提供了四个部分的名称,但提供程序不公开使用目录和/或架构所需的接口。

    错误 7313:为链接服务器“%ls”的提供程序“%ls”指定了无效的架构或目录。

    错误 7314:链接服务器“%ls”的 OLE DB 访问接口“%ls”不包含表“%ls”。 该表不存在,或者当前用户没有访问该表的权限。

    如果收到这些错误消息,则 Oracle 架构中可能缺少表,或者可能对该表没有权限。 使用大写验证架构名称是否已键入。 表和列的字母大小写应如 Oracle 系统表中的指定所示。

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

    以下调用显示该表是否存在于 Oracle 架构中。 此调用还显示确切的表名称。

    sp_tables_ex @table_server=Ora817Link, @table_schema='your_schema_name'
    
  • 消息 6

    错误 7413:无法连接到链接服务器 '%ls' (OLE DB 访问接口 '%ls')。 请启用委托或使用当前用户的远程 SQL Server 登录名。 Msg 18456,级别 14,状态 1,第 1 行登录失败的用户“”。

    此错误消息指示正在尝试对Microsoft Windows 经过身份验证的登录名进行分布式查询,而无需显式登录映射。 在不支持安全委派的操作系统环境中,Windows NT 经过身份验证的登录名需要显式映射到使用 <a0/> 创建的远程登录名和密码。

  • 消息 7

    错误 7391:无法执行该操作,因为链接服务器“%ls”的 OLE DB 访问接口“MSDAORA”无法开始分布式事务。 OLE DB 错误跟踪 [OLE/DB 提供程序 “MSDAORA” ITransactionJoin::JoinTransaction 返回0x8004d01b]

    验证是否已按照本文前面所述正确注册 OCI 版本。

    注意

    如果注册表项都正确,则会加载MtxOCI.dll文件。 如果未加载MtxOCI.dll文件,则无法使用 Oracle 的 Microsoft OLE DB 提供程序 或使用 Microsoft ODBC Driver for Oracle 针对 Oracle 执行分布式事务。 如果使用的是第三方提供程序,并且收到错误 7391,请验证正在使用的 OLE DB 提供程序是否支持分布式事务。 如果 OLE DB 访问接口确实支持分布式事务,请验证Microsoft分布式事务处理协调器(MSDTC)是否正在运行并且已启用 网络访问

  • 消息 8

    错误 7392:无法为链接服务器“%ls”的 OLE DB 访问接口'MSDAORA'启动事务。 OLE DB 错误跟踪 [OLE/DB 提供程序'MSDAORA' ITransactionLocal::StartTransaction 返回0x8004d013:ISOLEVEL=4096]。

    OLE DB 访问接口返回错误 7392,因为此会话只能有一个事务处于活动状态。 此错误表示在连接处于显式或隐式事务中时,正在针对 OLE DB 访问接口尝试数据修改语句,并且 OLE DB 访问接口不支持嵌套事务。 SQL Server 需要此支持,以便在某些错误条件下终止数据修改语句的影响,同时继续处理事务。

    如果 SET XACT_ABORTON,SQL Server 不需要 OLE DB 访问接口的嵌套事务支持。 因此,在隐式或显式事务中针对远程表执行数据修改语句之前执行 SET XACT_ABORT ON 。 如果正在使用的 OLE DB 提供程序不支持嵌套事务,请执行此操作。

排查与 Oracle 服务器的连接问题的技术

若要调试 Oracle Microsoft ODBC 驱动程序或 Oracle 的 Microsoft OLE DB 提供程序 的 Oracle 连接问题,请执行以下步骤:

  1. 使用 Oracle SQL Plus 实用工具(基于命令行的查询实用工具)验证是否可以连接到 Oracle 并检索数据。

    注意

    如果无法连接到 Oracle 并检索数据,则 Oracle 客户端组件的安装或配置不正确,或者在使用 SQL*Net Easy Configuration 或 Oracle Net8 Easy Configuration 实用工具时未正确为 Oracle 服务器创建了透明网络基底(TNS)服务别名。 请联系 Oracle 数据库管理员(DBA),验证必须正确安装和配置 Oracle 组件。

  2. 验证计算机上安装的 Oracle 客户端版本(SQL*Net 版本)。 适用于 Oracle 的 Microsoft ODBC 驱动程序和Oracle 的 Microsoft OLE DB 提供程序都需要在客户端计算机上安装 SQL*Net 版本 2.3 或更高版本。

    SQL Plus(Oracle 客户端查询工具)的连接可能看起来正常运行,但必须重新启动计算机才能使 ODBC/OLE DB 连接正常工作。

    注意

    使用 Oracle 8i 时,.rgs 文件为空。

  3. 如果安装了 Oracle 客户端,并且你收到一个错误,指示必须在计算机上安装 Oracle 客户端组件 7.3 或更高版本,然后验证客户端计算机上的环境变量 PATH 是否包含安装 Oracle 客户端的文件夹,例如, Oracle_Root\Bin。 如果找不到此文件夹,请将该文件夹添加到 PATH 变量以解决错误。

  4. 验证Ociw32.dll文件是否位于 Oracle_Root\bin 文件夹中。 此.dll文件不能存在于客户端计算机上的任何其他位置。 确保 Oracle 客户端组件 DLL(例如,Core40.dll 文件和 Ora*.dll 文件)不存在于Oracle_Root文件夹或子文件夹之外

  5. 验证计算机上是否安装了单个 Oracle 客户端版本。 同一客户端计算机上不能存在多个版本的 SQL*Net 干扰和关键操作(例如 TNS 和别名查找)。

  6. Microsoft建议你具有 Oracle 客户端的本地安装,而不是通过在计算机上映射远程 Oracle 客户端,然后将其包含在系统的路径中,以便通过 ODBC/OLE DB 连接到 Oracle。 但提供程序和驱动程序通过本地安装的 Oracle 客户端进行测试,而不是在网络共享上进行测试。

另请参阅