在SQL SERVER 2008 R2下用Windows
身份认证的登录名创建了一个访问ORACLE数据库的链接服务器xxxxx,测试成功,木有问题,但是其它登录名使用该链接服务器时,报如下错误:

背景:

首先sqlserver 链接oracle可以通过两个访问接口:

最近再用SSIS做数据归档,里面用到了分布式事务。在开发阶段是在一台计算机上运行只要是启动分布式服务就没什么问题,可是昨天把它部署到uat的时候遇到问题,错误信息是:

消息 7302,级别
16,状态 1,第 1 行

     全新服务器,需要增加性能监控,发现无法通过powershell读取性能指标

“MSDAORA” 和“OraOLEDB.Oracle”

图片 1

Cannot create an
instance of OLE DB provider “OraOLEDB.Oracle” for linked server
“xxxxxx”.

解决方法:

1、“MSDAORA”访问接口是由Microsoft OLE DB Provider for
Oracle提供的,这里建议不使用此接口进行链接。通过该访问接口建立的链接服务器在进行查询oracle表(带数据类型CLOB、BLOB字段)时会报这个错误“
链接服务器””的 OLE DB 访问接口 “MSDAORA” 返回了消息 “发生了一个 Oracle
错误,但无法从 Oracle 中检索错误信息。”。 链接服务器””的 OLE DB 访问接口
“MSDAORA” 返回了消息 “数据类型不被支持。”。 消息 7321,级别 16,状态
2,第 1 行 准备对链接服务器 “” 的 OLE DB 访问接口 “MSDAORA”
执行查询”select * from SYS_MESSAGE”时出错。”

最后找到解决方案:

 

  • Open the Registry Editor by going to the Start Menu and selecting
    Run…, then type “regedit”, and click the OK button.
  • Navigate to the
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurePipeServers\winreg registry
    key.
  • Right click on the “winreg” key and select Permissions. Add users or
    groups to which you want to grant Read access.
  • Exit Registry Editor and restart Windows.

2、“OraOLEDB.Oracle” 访问接口是由oracle 的Oracle Probider for OLE DB
驱动提供的。它解决了两个数据库类型不一致的的问题。而且如果需要使用分布式事务,必须使用它来创建链接服务器。后文会有详细介绍。 在创建之前,在SQLSERVER中,链接服务器->访问接口->OraOLEDB.Oracle->右键属性,选中
“Allow inprocess”
(中文为:允许进程内) 这一步是使我们选择的OraOLEDB.Oracle接口打开执行操作。如未设置会报如下错误: “无法初始化链接服务器
“null” 的 OLE DB 访问接口 “OraOLEDB.Oracle” 的数据源对象”

  1. 确认”Distribute Transaction
    Coordinator”服务在Server和本地都是运行状态。(如失败可以 输入:msdtc
    -resetlog (注意运行此命令时,不要执行挂起的事务)
  2. 在Server上打开 Component Services。 Control Panel –> System and
    Security –> Administrative Tools –> Component Services.
  3. 展开至 Component Services –> Computers –> My Computer –>
    Distributed Transaction Coordinator –> Local DTC,
    右键,选择Properties。在弹出的Dialog中选择Tab “Security”,
    勾选Network DTC Access 等选项,具体设置如下图。
    图片 2
  4. 以上的截图是在win8上的,如果你的系统是xp或是2003则有些变化.展开至
    Component Services –> Computers –> My Computer
    右键,选择Properties。在弹出的Dialog中选择Tab “MSDTC”–>Security
    Configuration, 勾选”Network DTC Access”, “Allow Remote Client”,
    “Allow Inbound/Outbound”, “Enable TIP” (Some option may not
    benecessary, have a try to get your configuration)
    等选项,具体设置如下图。
    图片 3
  5. 确认后会要求重新启动Service。注:如果在后面的步骤做完后,还是无法解决问题,可能需要重启电脑。
  6. 确认DTC不会被你的防火墙阻止。

此时需要在“服务器对象”——>“链接服务器”——>“访问接口”下,找到OraOLEDB.Oracle选项,单击右键选择属性,然后在访问接口选项下勾选“允许进程内”(Allow
inprocess)。即可解决上面问题,有时候,可能需要重新新建此链接服务器。

 

 请注意,如果大家的环境和我一样不在域里面,请选中不要求进行验证。否者在运行分布式事务时远程计算机会提示“此事务已明地或暗地被确认或终止
”。(计算机名称一定要能ping通,否则回报相同的错误),
注意xp系统下一般是ping不通的

图片 4

服务器 windows server 2008 r2 64位  或 win 7 enterprise 64位

是因为防火墙禁止了icmp数据包.
具体查看:
开始-控制面板-防火墙-高级-ICMP-设置.允许了就可以ping通了

 

  1. 服务器上需要安装Oracle
    64位的客户端(

图片 5

老外给出了一个解决这个问题的步骤,相当详细严谨,几乎面面俱到。可以作为参考学习的好资料:

安装完成后SQL
Server的访问接口上会新增”OraOLEDB.Oracle”(安装32位客户端,看不到)。

ps:

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注