一年有几次,我的团队会出于某种原因编写一个新的Oracle软件包,而且很多时候这个软件包只引用了这些软件包(我们的软件包运行的用户/角色)已经授予的表。
偶尔,情况并非如此。签入包,无法编译,我们收到一个含有表名附近行号的神秘错误消息。
麻烦的是,在这一点上,我们将等待几个小时(政治)批准过程发挥,授予,我们检查包...并且它失败了一个新的表名。 / p>
有没有办法以编程方式获取所有引用的列表?如果是这样,我们可以将其自动化以检查dba_tab_privs以查看是否需要预先授予补助,或者甚至生成授权脚本以使实际发放这些授权的团队更容易(特别是几个月之后,当它部署到生产时)我们再次经历了整个令人遗憾的混乱。)
答案 0 :(得分:5)
假设所有引用都是静态的(即代码中没有随机动态SQL的位),您可以查询`dba_dependencies'
select referenced_owner, referenced_name
from dba_dependencies
where owner = <<owner of package>>
and name = <<name of package>>
and type = 'PACKAGE BODY'
and referenced_type = 'TABLE'
您可以查找非表引用以及与包规范相关的依赖项以及包主体(如果您愿意)。这只会显示包体依赖于表格的情况。
答案 1 :(得分:1)
查看ALL_SOURCE表。您可以在TEXT列中查询您要查找的内容。
select *
from all_source
where type = 'PACKAGE BODY'
and owner = 'XYZ'
and name = 'YOUR PACKAGE NAME'
order by line;
编辑:Justin Cave的回答是正确的,但我会留下这个信息,因为每一点信息都有帮助。