首页 文章

如何在从不同模式调用过程时在oracle中查找所有嵌套的依赖对象

提问于
浏览
0

我有2个模式 - A和B.我在模式A的包中有一个过程,我想从模式B引用它 . 我已经在模式中给了这个包的授权,并在模式B中为它创建了一个同义词但是该程序将一系列程序调用到另一个程序中 . 因此,当我运行该过程时,它提供的表/视图不存在 . 我试图找出依赖对象并给予grant并为其中的一些创建同义词 . 但似乎依赖对象的列表太长了 . 所以,我只是想知道是否有任何方法,我可以找到我需要授予的所有对象并一次创建同义词,而不是逐个运行和检查..

谢谢你的帮助 .

艾卜哈 .

1 回答

  • 0

    我可以想到一些可能导致这个问题的不同拓扑结构 - 我将首先从最简单的解释开始 .

    如果在架构A上有表和代码(包) .

    给出以下测试对象

    create table tst_table(tst_val int); 
    
    create or replace package tst_pkg as 
      procedure tst_insert; 
    end tst_pkg; 
    /
    
    create or replace package body tst_pkg  as 
      procedure tst_insert as
      begin
        insert into tst_table (tst_val) values (44); 
      end; 
    end tst_pkg; 
    /
    

    您可以将tst_pkg上的execute授予另一个用户aka schema B,这个其他用户将能够使用tst_insert过程 - 如下所示

    SQL> exec iasim.tst_pkg.tst_insert;
    
    PL/SQL procedure successfully completed.
    

    但是 - 如果你有这种拓扑结构,你应该使用“authid current_user”来定义你的包 - 那么授予的执行就不再足够了 .

    如果您将包定义更改为

    create or replace package tst_pkg authid current_user as 
      procedure tst_insert; 
    end tst_pkg; 
    /
    

    尝试执行该过程时,您将收到此错误

    SQL> exec iasim.tst_pkg.tst_insert;
    BEGIN iasim.tst_pkg.tst_insert; END;
    
    *
    ERROR at line 1:
    ORA-00942: table or view does not exist
    ORA-06512: at "IASIM.TST_PKG", line 4
    ORA-06512: at line 1
    

    所以 - 如果是这种情况你应该只编译你的包没有“authid current_user”并授予用户执行权限 - 这是将行插入tst_table所需的权限我的例子,如果它是通过test_pkg中的过程完成的 .

    如果这有帮助,或者如果您安排了不同的部分,请告诉我 .

相关问题