21

我正在尝试从 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)".

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

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

编辑

我已经在两台运行Windows 7 x64Windows Server 2008 x64MS SQL Server 2008 x64的机器上进行了尝试。两者都显示相同的错误消息。

4

8 回答 8

53

在 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
于 2013-01-24T12:28:19.350 回答
13

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

  1. 运行 (CTRL + R) “dcomcnfg”。导航到“组件服务 -> 计算机 -> 我的电脑 -> DCOM 配置”。
  2. 打开“MSDANITIALIZE”的属性页。
  3. 复制属性页面上的“应用程序 ID”。
  4. 关闭“dcomcnfg”。
  5. 运行“注册表”。使用 ??? 导航到“HKEY_CLASSES_ROOT\AppID{???}” 表示您在步骤 #3 中复制的应用程序 ID。
  6. 右键单击“{???}”文件夹并选择“权限”</li>
  7. 将本地管理员组添加到权限,授予他们完全控制权。
  8. 关闭“注册表”。
  9. 重新启动服务器。
  10. 运行“dcomconfig”。导航到“组件服务 -> 计算机 -> 我的电脑 -> DCOM 配置”。
  11. 打开“MSDANITIALIZE”的属性页。
  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. 重新启动服务器。
于 2013-06-05T18:19:37.943 回答
7

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

Cannot create an instance of OLE DB provider "(OLEDB provider name)"...

此问题最直接的答案由Microsoft KB 2647989提供,因为“MSDANITIALIZE DCOM 类的安全设置不正确”。

解决方案是修复 MSDANITIALIZE 的安全设置。在 Windows Vista 和更高版本中,该类归 TrustedInstaller 所有,因此必须更改 MSDANITIALIZE 的所有权,然后才能调整安全性。上面的知识库有详细的说明。

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

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

这个问题至少可以追溯到 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 指导并调整 MSDANITIALIZE 安全性。

于 2013-11-21T14:24:22.060 回答
2

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

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

我必须从 GUID 级别删除密钥,然后找到 ProgID (OraOLEDB.Oracle) 密钥,并将其也删除。(ProgID 作为一对链接到 CLSID)。

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

只是单独重新注册并不能解决问题,我不得不删除注册表项以使其指向正确的位置。或者,破解 InprocServer32 位置。

现在我有错误 7308,关于单线程公寓;滚!

于 2016-01-14T12:27:26.307 回答
1

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

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

于 2019-03-29T17:36:25.810 回答
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 不存在)
  • 安装32bit Oracle 10g 10.2.0.5 补丁(在 setup.exe 上设置W7 兼容性)
  • 重启 SQL 服务
  • 在 MSDAORA 提供程序中选中允许处理
  • 测试链接的oracle服务器连接
于 2018-07-24T07:22:39.243 回答
0

除了其他很好的回应之外,我只需要授予 Oracle 安装文件夹的 NTFS 权限。(我授予了读取权限)

于 2018-03-13T16:42:03.590 回答
0

只需在 OraOLEDB.oracle 提供程序的属性上启用选项“允许处理中”,如下所示

  • [打开服务器对象>链接服务器>提供程序] 1 [右键单击
  • OraOLEDB.oracle > properties ] 2然后选择选项“Allow in
  • 过程”,然后单击确定
于 2022-02-20T11:06:06.557 回答