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

Posted

技术标签:

【中文标题】在从不同模式调用过程时如何在 oracle 中查找所有嵌套的依赖对象【英文标题】:How to find the all the nested dependent objects in oracle while calling a procedure from different schema 【发布时间】:2018-10-16 09:33:27 【问题描述】:

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

感谢您的帮助。

阿卜哈。

【问题讨论】:

你是如何找到依赖对象的,它是如何/为什么“太长”的?您是否正在使用或寻找针对all_dependencies 的递归查询?默认情况下,这通常不是问题;使用invoker's rights的包也是如此,如果需要,是否需要? 我只是一一进入程序内部调用的包并给予授权。但是对于几个包我做了同样的事情,但似乎每个包都在调用一个新包,所以在调用中逐个检查是有点困难的。而且,没有这个包不是使用 AUTHID。这不是问题,我只是想获得一个方法,当我调用某个 package.procedure 时,我可以通过该方法获取内部调用的所有对象。 如果您的包具有默认定义者权限,那么您无需授予任何其他权限。这是使用包的优势之一——它们使用和调用的所有内容,包括其他包,对调用者都是隐藏的。如果您收到该错误,则调用者的权利必须在某处起作用。无论如何,您可能还想查看PL/Scope 以了解更多关于正在使用的内容。 嗨,对不起,从我的包(模式 B)调用的包(在模式 A 中)确实有调用者权利。它已被定义为:在 APPS 模式中创建或替换包 WF_LOCAL_SYNCH AUTHID CURRENT_USER。我将查看您提供的链接以深入了解。 【参考方案1】:

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

如果您的表和代码(包)位于架构 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 中的过程完成.

请让我知道这是否有帮助,或者您是否安排了不同的作品。

【讨论】:

嗨..感谢您的 cmets.. 我正在使用没有 authid 子句的软件包,所以您的第一个场景对我来说很好。但我的问题是,我授予授权的包(在您的示例中为 tst_pkg)也调用了其他包(B),包 B 调用了另一个包(C)等等。因此,我需要授予所有已由我的调用包的过程在内部调用的包。 创建包体 tst_pkg 作为过程 tst_insert 作为开始 PKG_B.proc_b();结束 tst_pkg;创建包体 PKG_B 作为过程 proc_b 作为开始 PKG_C.proc_c();结尾;创建包体 PKG_C 作为过程 proc_c as begin PKG_D.proc_C();结尾;所以当我授予包 tst_pkg 时,这还不够。我还需要授予其他依赖包,即 PKG_B、PKG_c 等。但是如何找出所有依赖包,以便我可以授予所有这些包? @Abha - 在 ALL_DEPENDENCIES 视图中很容易找到依赖项 - 您可以运行 select * from ALL_DEPENDENCIES where name = '; 之类的查询 这个查询只给出了一个向下的依赖关系,而不是嵌套的对象。

以上是关于在从不同模式调用过程时如何在 oracle 中查找所有嵌套的依赖对象的主要内容,如果未能解决你的问题,请参考以下文章

oracle中存储过程的调用 恳请大家帮忙,谢谢~~

如何在 Oracle 中查找模式名称?当您使用只读用户在 sql 会话中连接时

oracle spool 脚本在 cmd.exe 中工作,但在从代码调用时挂起

oracle数据库调用存储过程

在 Java 中调用 Oracle 存储过程时如何避免核心转储

Oracle 10gR2过程中调用其他模式过程的权限