在 SQL Server 中设置到 Oracle 数据库的链接服务器并对其进行故障排除

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

原始产品版本:Microsoft SQL Server 2005 Standard Edition、Microsoft SQL Server 2005 Developer Edition、Microsoft SQL Server 2005 Enterprise Edition、Microsoft SQL Server 2005 Express Edition、Microsoft SQL Server2005 工作组版
原始 KB 编号: 280106

摘要

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

有关使用 Oracle 的 OLEDB 提供程序配置链接服务器的详细信息,请参阅 如何启动和运行 Oracle 和链接服务器

重要

适用于 Oracle 的 Microsoft ODBC 驱动程序的当前版本符合 ODBC 2.5 规范,而适用于 Oracle 的 OLE DB 提供程序是本机 Oracle 7 OCI API 提供程序。 驱动程序和提供程序都使用适用于 Oracle 8x) 的 SQL*Net 客户端 (或 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 文件中为 @datasrc 参数配置的 Oracle 服务器别名。 有关详细信息,请参阅 SQL Server 联机丛书中的“sp_addlinkedserver”主题。

常见错误消息及其故障排除方法

重要

此部分(或称方法或任务)介绍了修改注册表的步骤。 但是,注册表修改不当可能会出现严重问题。 因此,请务必严格按照这些步骤操作。 为了加强保护,应先备份注册表,再进行修改。 如果出现问题,可以还原注册表。 有关如何备份和还原注册表的详细信息,请单击以下文章编号以查看 Microsoft 知识库中的文章: 322756 如何在 Windows 中备份和还原注册表

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

  • 方法 1

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

    DBCC Traceon(7300)
    
  • 方法 2

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

    Interface::方法失败,出现十六进制错误代码。

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

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

注意

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

  • 消息 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 服务器连接问题的技术 部分。

  • 消息 3

    错误 7302:无法为链接服务器“%ls”创建 OLE DB 访问接口“MSDAORA”实例。

    确保正确注册 MSDAORA.dll 文件。 (MSDAORA.dll 文件是 Oracle file 的 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登录名。 用户“”的“消息 18456、级别 14、状态 1、第 1 行登录失败。

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

  • 消息 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 并检索数据,则使用 SQL*Net Easy Configuration 或 Oracle Net8 Easy Configuration 实用工具时,Oracle 客户端组件的安装或配置不正确,或者未正确为 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 客户端而不是网络共享进行测试的。

另请参阅