运行 DBMS_COMPARISON.CONVERGE 子程序时出现错误 ORA-00942

Posted

技术标签:

【中文标题】运行 DBMS_COMPARISON.CONVERGE 子程序时出现错误 ORA-00942【英文标题】:Error ORA-00942 running DBMS_COMPARISON.CONVERGE subprogram 【发布时间】:2020-10-08 09:31:14 【问题描述】:

当我运行使用 DBMS_COMPARISON 包在两个不同架构上同步两个表的存储过程时,我得到 ORA-00942 - 表或视图不存在 - 错误。

这大概就是我所拥有的:

remote table        local comparison     local table    
DB1.PRODUCTS        DB2.PRODUCTS_CMP     DB2.PRODUCTS

这是本地 DB2 过程:

create or replace PROCEDURE SYNC_SINGLE AS
          L_SCAN_INFO         SYS.DBMS_COMPARISON.COMPARISON_TYPE;
          L_RESULT            BOOLEAN;   
          L_COMPNAME          VARCHAR2(30);
BEGIN
          L_COMPNAME:='PRODUCT_CMP';
          
          SYS.DBMS_COMPARISON.PURGE_COMPARISON(
                   COMPARISON_NAME => L_COMPNAME
          );

          L_RESULT := 
                    SYS.DBMS_COMPARISON.COMPARE (
                    COMPARISON_NAME => L_COMPNAME,
                    SCAN_INFO       => L_SCAN_INFO,
                    PERFORM_ROW_DIF => TRUE
          );

          FOR ROW_ID IN (
                    SELECT    SCAN_ID
                    FROM      USER_COMPARISON_SCAN_SUMMARY
                    WHERE     COMPARISON_NAME = L_COMPNAME
                              AND STATUS = 'BUCKET DIF'
          )
          LOOP      
                    SYS.DBMS_COMPARISON.CONVERGE (
                              COMPARISON_NAME  => L_COMPNAME,
                              SCAN_ID          => ROW_ID.SCAN_ID,
                              SCAN_INFO        => L_SCAN_INFO,
                              CONVERGE_OPTIONS => SYS.DBMS_COMPARISON.CMP_CONVERGE_REMOTE_WINS, 
                              PERFORM_COMMIT   => FALSE
                    );
          END LOOP ROW_ID;

          SYS.DBMS_COMPARISON.PURGE_COMPARISON(
                   COMPARISON_NAME => L_COMPNAME
          );

END SYNC_SINGLE;

程序以这些错误结束:

ORA-00942: table or view does not exist
ORA-06512: a "SYS.DBMS_COMPARISON", line 734
ORA-06512: a "SYS.DBMS_COMPARISON", line 5964
ORA-06512: a "SYS.DBMS_COMPARISON", line 682
ORA-06512: a "DB2.SYNC_SINGLE", line 26
ORA-06512: a "DB2.SYNC_SINGLE", line 26
ORA-06512: a line 2

我猜这里存在权限问题,但我不知道是什么问题。用户 SYS 已获得对本地表 DB2.PRODUCTS 授予的所有权限。 此外,我在相同的模式上有其他表,我以相同的方式同步这些表,对于这些表,一切都很好。查看 SYS.COMPARISON$ 和 SYS.COMPARISON_COL$ 表,一切似乎都配置正确。

谁能帮忙建议我应该检查什么?

【问题讨论】:

表权限是直接授予过程所有者还是通过角色授予? 所有权限都直接授予用户SYS 当您将表称为DB2.PRODUCTS 时,这究竟是什么意思?你说你有一个本地和远程数据库,但DB2.PRODUCTS 将引用本地数据库的DB2 架构中的PRODUCTS 表,而DB1.PRODUCTS 将引用DB1 架构中的PRODUCTS 表的本地数据库。如果您在远程数据库中有一个对象,则需要通过数据库链接(即PRODUCTS@db1)进行引用。您是否在本地和远程数据库的 SYS 架构中创建了单独的 PRODUCTS 表? 我也看不到你在哪里运行create_comparison 两个模式(DB1 和 DB2)位于两个独立的数据库中。 DB1.PRODUCTS 在远程,并且有一个数据库链接。比较是通过单独的程序进行的。 【参考方案1】:

我发现它是什么:AUTHID CURRENT_USER 在过程声明中丢失。

create or replace PROCEDURE SYNC_SINGLE AUTHID CURRENT_USER AS

【讨论】:

以上是关于运行 DBMS_COMPARISON.CONVERGE 子程序时出现错误 ORA-00942的主要内容,如果未能解决你的问题,请参考以下文章

JMeter笔记15 | JMeter场景运行

JMeter笔记15 | JMeter场景运行

在 spyder IDE 中,运行选择工作正常,运行文件保持运行/挂起

关于运行osgi插件时和运行环境相关的问题

运行里面怎么以管理员身份运行

linux下如何运行程序?