“无法创建OLE DB提供程序的实例”错误作为Windows身份验证用户

问题描述 投票:20回答:7

我试图在Oracle服务器上从MS SQL Server运行openrowset。

当我执行以下命令时:

select * from
OPENROWSET('OraOLEDB.Oracle','srv';'user';'pass', 
'select * from table')

发生以下错误

Msg 7302, Level 16, State 1, Line 1
Cannot create an instance of OLE DB provider "OraOLEDB.Oracle" for linked server "(null)".

任何人都可以告诉我如何使用qwwxswpoi openrowset?

我使用的是64位版本的MS SQL Server和Oracle OLEDB驱动程序。

编辑

我在运行带有MS SQL Server 2008 x64的Windows 7 x64和Windows Server 2008 x64的两台计算机上尝试过此操作。两者都显示相同的错误消息。

sql-server oracle oledb windows-authentication linked-server
7个回答
47
投票

在SQL Server企业管理器中,打开OraOLEDB.Oracle,右键单击\Server Objects\Linked Servers\Providers提供程序,选择属性并检查OraOLEDB.Oracle选项。重新创建链接的服务器并再次测试。

如果您无权访问SQL Server Management Studio,还可以执行以下查询:

"Allow inprocess"

12
投票

遇到这个问题,链接服务器适用于服务器上本地管理员的用户,但不适用于其他任何人。经过几个小时的乱七八糟,我设法使用以下步骤解决问题:

  1. 运行(CTRL + R)“dcomcnfg”。导航到“组件服务 - >计算机 - >我的电脑 - > DCOM配置”。
  2. 打开“MSDAINITIALIZE”的属性页面。
  3. 复制属性页面上的“应用程序ID”。
  4. 关闭“dcomcnfg”。
  5. 运行“regedit”。使用???导航到“HKEY_CLASSES_ROOT \ AppID {???}”表示您在步骤#3中复制的应用程序ID。
  6. 右键单击“{???}”文件夹并选择“权限”
  7. 将本地管理员组添加到权限,授予他们完全控制权。
  8. 关闭“注册”。
  9. 重新启动服务器。
  10. 运行“dcomconfig”。导航到“组件服务 - >计算机 - >我的电脑 - > DCOM配置”。
  11. 打开“MSDAINITIALIZE”的属性页面。
  12. 在“安全”选项卡上,选择“启动和激活权限”下的“自定义”,然后单击“编辑”按钮。
  13. 添加“Authenticated Users”并授予他们所有4个启动和激活权限。
  14. 关闭“dcomcnfg”。
  15. 找到Oracle安装根目录。在我的案例中,“E:\ Oracle”。
  16. 编辑Oracle根目录的安全性属性。添加“Authenticated Users”并授予它们“Read&Execute”,“List folder contents”和“Read”权限。应用新权限。
  17. 单击“高级权限”按钮,然后单击“更改权限”。选择“使用此对象的可继承权限替换所有子对象权限”。应用新权限。
  18. 在SQL Server中找到“OraOLEDB.Oracle”提供程序。确保选中“允许进程”参数。
  19. 重新启动服务器。

7
投票

使用Windows身份验证(而不是本地SQL Server帐户)连接到SQL Server时,尝试使用链接服务器可能会导致错误消息:

EXEC master.dbo.sp_MSset_oledb_prop N'OraOLEDB.Oracle', N'AllowInProcess', 1

这个问题最直接的答案是由Cannot create an instance of OLE DB provider "(OLEDB provider name)"... 提供的,因为“MSDAINITIALIZE DCOM类的安全设置不正确”。

解决方案是修复MSDAINITIALIZE的安全设置。在Windows Vista及更高版本中,该类由TrustedInstaller拥有,因此必须先更改MSDAINITIALIZE的所有权,然后才能调整安全性。上面的KB有详细的说明。

Microsoft KB 2647989

MSDAINITIALIZE是OLE DB提供的COM类。此类可以解析OLE DB连接字符串,并根据连接字符串中的属性值加载/初始化提供程序。 MSDAINITILIAZE由连接到SQL Server的用户启动。如果使用Windows身份验证连接到SQL Server,则会在登录的用户帐户下初始化提供程序。如果登录的用户是SQL登录名,则在SQL Server服务帐户下初始化提供程序。根据使用的登录类型,必须相应地提供MSDAINITIALIZE的权限。

该问题至少可以追溯到SQL Server 2000; This MSDN blog post describes the reason(参见“消息3”)并具有为OLEDB提供程序设置In Process标志的建议修复程序。

虽然设置In Process可以解决当前的问题,但它可能不是您想要的。根据微软的说法,

在SQL Server进程外部实例化提供程序可以保护SQL Server进程免受提供程序中的错误的影响。在SQL Server进程外部实例化提供程序时,不允许引用长列(text,ntext或image)的更新或插入。 - KB 280106 from Microsoft describes the error

更好的答案是使用Microsoft指南并调整MSDAINITIALIZE安全性。


2
投票

特别是对于错误7302,我在我的注册表中发现,在寻找OraOLEDB.Oracle时,InprocServer32位置是错误的。

如果是这种情况,或者您在注册表中找不到该字符串,则必须安装或重新注册该组件。

我不得不从GUID级别删除密钥,然后找到ProgID(OraOLEDB.Oracle)密钥,并删除它。 (ProgID作为一对链接到CLSID)。

然后我通过调用ORAOLEDB * .dll上的regsvr32.exe重新注册了OraOLEDB.Oracle。

仅仅重新注册并没有解决问题,我不得不删除注册表项,使其指向正确的位置。或者,破解InprocServer32位置。

现在我有错误7308,关于单线程公寓;继续前进!


0
投票

除了其他很棒的响应,我只需要给Oracle安装文件夹赋予NTFS权限。 (我给了读取权限)


0
投票

以下配置的类似情况:

  • Windows Server 2012 R2标准版
  • MS SQL Server 2008(也测试了SQL 2012)
  • Oracle 10g客户端(OracleDB v8.1.7)
  • MSDAORA提供商
  • 错误ID:7302

我的解决方案

  • 安装32位MS SQL Server(64位MSDAORA不存在)
  • 安装32位Oracle 10g 10.2.0.5补丁(在setup.exe上设置W7兼容性)
  • 重新启动SQL服务
  • 在MSDAORA提供程序中选中允许进程
  • 测试链接的oracle服务器连接

0
投票

尝试链接到Oracle 12c的SQL Server 2017上收到同样的错误。我们能够使用Oracle的SQL Developer连接到源数据库,但链接服务器不断抛出7302错误。

最后,我们停止了所有SQL服务,然后重新安装了ODAC组件。启动SQL服务备份,瞧!

© www.soinside.com 2019 - 2024. All rights reserved.