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

th1*_*ey3 20 sql-server oracle oledb linked-server windows-authentication

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

当我执行以下命令时:

select * from
OPENROWSET('OraOLEDB.Oracle','srv';'user';'pass', 
'select * from table')
Run Code Online (Sandbox Code Playgroud)

发生以下错误

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

谁能告诉我如何使用openrowset OraOLEDB.Oracle

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

编辑

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

Dav*_*ant 47

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

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

EXEC master.dbo.sp_MSset_oledb_prop N'OraOLEDB.Oracle', N'AllowInProcess', 1
Run Code Online (Sandbox Code Playgroud)

  • 根据我的经验,有必要重新启动MSSQL服务以使"allow inprocess"选项生效. (8认同)
  • Brabank,我已经尝试过,但它仍然显示相同的错误. (3认同)
  • 谢谢你的回答,它节省了我的一天. (2认同)

小智 13

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

  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. 重新启动服务器.


pat*_*net 7

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

Cannot create an instance of OLE DB provider "(OLEDB provider name)"...
Run Code Online (Sandbox Code Playgroud)

Microsoft KB 2647989提供了此问题的最直接答案,因为"MSDAINITIALIZE DCOM类的安全设置不正确".

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

这篇MSDN博客文章描述了原因:

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

该问题至少可以追溯到SQL Server 2000; Microsoft的KB 280106描述了该错误(请参阅"消息3"),并提供了为OLEDB提供程序设置In Process标志的建议修复程序.

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

在SQL Server进程外部实例化提供程序可以保护SQL Server进程免受提供程序中的错误的影响.在SQL Server进程外部实例化提供程序时,不允许引用长列(text,ntext或image)的更新或插入.- SQL Server 2008 R2的链接服务器属性文档.

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