【问题标题】:SSMA unable to find specified providerSSMA 找不到指定的提供商
【发布时间】:2019-01-03 10:18:48
【问题描述】:

我已经安装了完整的 oracle 客户端 12.2.0,我正在尝试使用 SSMA 将一些数据库从 oracle 迁移到 sql server,但是当我尝试连接到 oracle 时出现以下错误:

Unable to find specified provider.
Compatible Oracle Data Access Connectivity libraries were not found on the machine.

我已经设置了环境变量 HOME_ORACLE 并且 PATH 是在安装过程中默认设置的,所以我排除了问题的存在。 我还搜索了有关 ODAC 的信息,所有提示都让我想起了 oracle istant 提供程序,但是由于我已经使用管理员安装(完整)安装了客户端,所以我认为安装也会涵盖它们。 有什么建议吗?

编辑:我尝试使用标准模式和 tnsnames 模式登录,但结果相同

【问题讨论】:

    标签: oracle odac sql-server-migration-assi


    【解决方案1】:

    Oracle Universal Installer 12.2 中似乎有一个错误,它没有注册 ODP.NET 组件。您可以运行下面的脚本(根据您的系统修改文件夹名称)以正确配置它们。

    set Oracle_x64=c:\oracle\product\12.1\Client_x64\odp.net
    set OraProvCfg_x64=%Oracle_x64%\bin\4\OraProvCfg.exe
    
    set Oracle_x86=c:\oracle\product\12.1\Client_x86\odp.net
    set OraProvCfg_x86=%Oracle_x86%\bin\4\OraProvCfg.exe
    
    set TNS_ADMIN=C:\oracle\network\admin
    
    
    
    IF EXIST "%Oracle_x64%\managed\common\Oracle.ManagedDataAccess.dll" "%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\managed\common\Oracle.ManagedDataAccess.dll
    IF EXIST "%Oracle_x64%\managed\PublisherPolicy\4\Policy.4.121.Oracle.ManagedDataAccess.dll" "%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\managed\PublisherPolicy\4\Policy.4.121.Oracle.ManagedDataAccess.dll
    IF EXIST "%Oracle_x64%\managed\PublisherPolicy\4\Policy.4.122.Oracle.ManagedDataAccess.dll" "%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\managed\PublisherPolicy\4\Policy.4.122.Oracle.ManagedDataAccess.dll
    
    IF EXIST "%Oracle_x64%\managed\common\Oracle.ManagedDataAccess.dll" "%OraProvCfg_x64%" /action:config /product:odpm /frameworkversion:v4.0.30319 /providerpath:%Oracle_x64%\managed\common\Oracle.ManagedDataAccess.dll /set:settings\TNS_ADMIN:%TNS_ADMIN%
    IF EXIST "%Oracle_x86%\managed\common\Oracle.ManagedDataAccess.dll" "%OraProvCfg_x86%" /action:config /product:odpm /frameworkversion:v4.0.30319 /providerpath:%Oracle_x86%\managed\common\Oracle.ManagedDataAccess.dll /set:settings\TNS_ADMIN:%TNS_ADMIN%
    
    rem Oracle.ManagedDataAccessDTC was used in earlier versions, not used anymore
    "%OraProvCfg_x64%" /action:ungac /providerpath:Oracle.ManagedDataAccessDTC
    
    IF EXIST "%Oracle_x64%\bin\2.x\Oracle.DataAccess.dll" "%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\bin\2.x\Oracle.DataAccess.dll
    IF EXIST "%Oracle_x64%\PublisherPolicy\2.x\Policy.2.102.Oracle.DataAccess.dll" "%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\PublisherPolicy\2.x\Policy.2.102.Oracle.DataAccess.dll
    IF EXIST "%Oracle_x64%\PublisherPolicy\2.x\Policy.2.111.Oracle.DataAccess.dll" "%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\PublisherPolicy\2.x\Policy.2.111.Oracle.DataAccess.dll
    IF EXIST "%Oracle_x64%\PublisherPolicy\2.x\Policy.2.112.Oracle.DataAccess.dll" "%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\PublisherPolicy\2.x\Policy.2.112.Oracle.DataAccess.dll
    IF EXIST "%Oracle_x64%\PublisherPolicy\2.x\Policy.2.121.Oracle.DataAccess.dll" "%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\PublisherPolicy\2.x\Policy.2.121.Oracle.DataAccess.dll
    IF EXIST "%Oracle_x64%\PublisherPolicy\2.x\Policy.2.122.Oracle.DataAccess.dll" "%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\PublisherPolicy\2.x\Policy.2.122.Oracle.DataAccess.dll
    
    IF EXIST "%Oracle_x64%\bin\4\Oracle.DataAccess.dll" "%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\bin\4\Oracle.DataAccess.dll
    IF EXIST "%Oracle_x64%\PublisherPolicy\4\Policy.4.112.Oracle.DataAccess.dll" "%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\PublisherPolicy\4\Policy.4.112.Oracle.DataAccess.dll
    IF EXIST "%Oracle_x64%\PublisherPolicy\4\Policy.4.121.Oracle.DataAccess.dll" "%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\PublisherPolicy\4\Policy.4.121.Oracle.DataAccess.dll
    IF EXIST "%Oracle_x64%\PublisherPolicy\4\Policy.4.122.Oracle.DataAccess.dll" "%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\PublisherPolicy\4\Policy.4.122.Oracle.DataAccess.dll
    
    IF EXIST "%Oracle_x86%\bin\2.x\Oracle.DataAccess.dll" "%OraProvCfg_x86%" /action:gac /providerpath:%Oracle_x86%\bin\2.x\Oracle.DataAccess.dll
    IF EXIST "%Oracle_x86%\PublisherPolicy\2.x\Policy.2.102.Oracle.DataAccess.dll" "%OraProvCfg_x86%" /action:gac /providerpath:%Oracle_x86%\PublisherPolicy\2.x\Policy.2.102.Oracle.DataAccess.dll
    IF EXIST "%Oracle_x86%\PublisherPolicy\2.x\Policy.2.111.Oracle.DataAccess.dll" "%OraProvCfg_x86%" /action:gac /providerpath:%Oracle_x86%\PublisherPolicy\2.x\Policy.2.111.Oracle.DataAccess.dll
    IF EXIST "%Oracle_x86%\PublisherPolicy\2.x\Policy.2.112.Oracle.DataAccess.dll" "%OraProvCfg_x86%" /action:gac /providerpath:%Oracle_x86%\PublisherPolicy\2.x\Policy.2.112.Oracle.DataAccess.dll
    IF EXIST "%Oracle_x86%\PublisherPolicy\2.x\Policy.2.121.Oracle.DataAccess.dll" "%OraProvCfg_x86%" /action:gac /providerpath:%Oracle_x86%\PublisherPolicy\2.x\Policy.2.121.Oracle.DataAccess.dll
    IF EXIST "%Oracle_x86%\PublisherPolicy\2.x\Policy.2.122.Oracle.DataAccess.dll" "%OraProvCfg_x86%" /action:gac /providerpath:%Oracle_x86%\PublisherPolicy\2.x\Policy.2.122.Oracle.DataAccess.dll
    
    IF EXIST "%Oracle_x86%\bin\4\Oracle.DataAccess.dll" "%OraProvCfg_x86%" /action:gac /providerpath:%Oracle_x86%\bin\4\Oracle.DataAccess.dll
    IF EXIST "%Oracle_x86%\PublisherPolicy\4\Policy.4.112.Oracle.DataAccess.dll" "%OraProvCfg_x86%" /action:gac /providerpath:%Oracle_x86%\PublisherPolicy\4\Policy.4.112.Oracle.DataAccess.dll
    IF EXIST "%Oracle_x86%\PublisherPolicy\4\Policy.4.121.Oracle.DataAccess.dll" "%OraProvCfg_x86%" /action:gac /providerpath:%Oracle_x86%\PublisherPolicy\4\Policy.4.121.Oracle.DataAccess.dll
    IF EXIST "%Oracle_x86%\PublisherPolicy\4\Policy.4.122.Oracle.DataAccess.dll" "%OraProvCfg_x86%" /action:gac /providerpath:%Oracle_x86%\PublisherPolicy\4\Policy.4.122.Oracle.DataAccess.dll
    

    更新

    根据Oracle Doc ID 2272241.1,这似乎是故意的:

    适用于:
    适用于 .NET 的 Oracle 数据提供程序 - 版本 12.1.0.2 及更高版本
    Microsoft Windows x64(64 位)
    Microsoft Windows(32 位)

    症状
    为 .Net 安装 12.2 Oracle 数据提供程序时,提供程序 不会在全局程序集缓存 (GAC) 中自动注册。

    变化
    移至 .Net 的 Oracle Provider 的 12.2 版本

    原因
    这是预期的行为。由于有这么多环境正在使用 多个版本的 ODP.Net 并排,从 12.2 开始, 安装程序不会自动在 默认为 GAC。

    解决方案
    按照文档 ID 中的说明手动将 dll 注册到 GAC 1169890.1:HOWTO:使用 OraProvCfg.exe 从全局程序集缓存中添加/删除 Oracle 程序集的示例

    但是,我认为这是一个错误。并行运行多个版本的 ODP.Net 是相当困难的,因为 Oracle.DataAccess.dll 的版本必须完全匹配 Oracle 客户端的版本。安装多个 Oracle 客户端(即 64 位和 32 位各安装多个)通常会导致很多问题,而且并不常见。

    【讨论】:

    • 感谢您的回复,并原谅我下一个(也许很明显)问题:我必须在命令行中运行这些脚本吗?我还需要根据我的系统架构只执行 set 语句还是必须运行所有语句?
    • 您可以直接运行它或作为 BATCH 脚本运行。它涵盖了所有可用的版本,由于IF EXIST ... 表达式,它只执行相关的命令。当然,如果您只安装了 64 位版本,那么您可以跳过 32 位(即 x86)行。
    • @Serphentelm,在这种情况下,请接受答案。
    猜你喜欢
    • 2020-02-05
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 2016-10-23
    • 2019-04-06
    相关资源
    最近更新 更多