【问题标题】:Is there a way to programmatically extract table references from an Oracle package?有没有办法以编程方式从 Oracle 包中提取表引用?
【发布时间】:2016-11-24 06:39:14
【问题描述】:

一年几次,我的团队会出于某种原因编写一个新的 Oracle 包,而且大部分时间这个包只引用包(我们的包运行的用户/角色)已经获得授权的表。

有时情况并非如此。包被签入,它无法编译,我们收到一条神秘的错误消息,表名附近有一个行号。

问题在于,此时,我们将等待几个小时以等待(政治)批准过程结束,授予授权,我们将包签入......但它以新的表名失败。

有没有办法以编程方式获取所有引用的列表?如果是这样,我们可以将其自动化以检查 dba_tab_privs 以查看是否需要事先授权,或者甚至生成授权脚本以使实际发放这些授权的团队更容易(尤其是几个月后,当它被部署到生产环境时)我们再次经历了整个抱歉的混乱)。

【问题讨论】:

    标签: oracle plsql package


    【解决方案1】:

    假设所有引用都是静态的(即您的代码中没有一些随机动态 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'
    

    如果您愿意,您也可以查找与包规范以及包主体相关的非表引用或依赖项。这只会显示包主体依赖于表的情况。

    【讨论】:

    • 该死的,他们不给我 dba_dependencies 的权限!
    • @Gary_W - 您可能可以使用all_dependenciesuser_dependences,具体取决于您可以做出的假设。但是,如果您正在考虑使用dba_tab_privs 来自动执行需要进行的授权,我认为您可以请求dba_dependencies 的权限。
    • 甜蜜! ALL_DEPENDENCIES 有效。这对我来说是一个新的。谢谢!
    【解决方案2】:

    查看 ALL_SOURCE 表。您可以在 TEXT 列中查询您要查找的内容。

    select *
    from all_source
    where type = 'PACKAGE BODY'
    and owner = 'XYZ'
    and name = 'YOUR PACKAGE NAME'
    order by line;
    

    编辑:贾斯汀·凯夫的答案是正确的,但无论如何我都会把这个留在这里作为信息,因为每一点信息都会有所帮助。

    【讨论】:

      猜你喜欢
      • 2016-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      • 2022-11-04
      • 1970-01-01
      相关资源
      最近更新 更多