我有2个模式 - A和B。我在架构 A 中的包中有一个过程,我想从架构 B 引用它。我已经在 A 架构中为这个包提供了授权,并在架构 B 中为它创建了一个同义词。但是该过程在彼此内部调用一系列过程。因此,当我运行该过程时,它给出的表/视图不存在。我试图找出依赖对象,并为其中的几个对象授予和创建同义词。但似乎依赖对象的列表太长了。所以,我只是想知道是否有任何方法,我可以一次性找到我需要授予并创建同义词的所有对象,而不是运行并逐个检查..
感谢您的帮助。
艾卜哈。
我可以想到一些可能导致此问题的不同拓扑 - 我将首先从我能想到的最简单的解释开始。
如果架构 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授予其他用户(即架构 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 中的过程完成。
请让我知道这是否有帮助,或者您是否安排了不同的作品。