【问题标题】:PL/SQL:How to make sure a function exists?PL/SQL:如何确保函数存在?
【发布时间】:2013-05-06 08:25:53
【问题描述】:

好吧,我在运行 PL/SQL 函数时遇到了“权限不足”的问题:

以下是我遵循的步骤:在我的 Windows 命令提示符中,我按如下方式登录:

代码:

sqlplus / as sysdba

我得到了 SQL> 提示,然后我尝试授予我的函数“age”的权限,如下所示:

代码:

 SQL> GRANT EXECUTE on AGE to SCOTT;

其中,AGE 是函数名,SCOTT 是用户

我指的是以下文档:

http://www.techonthenet.com/oracle/grant_revoke.php

我收到错误 ORA-0402:函数体不存在。如何在发出 GRANT 之前保存我的函数体?

请帮忙!

【问题讨论】:

    标签: sql plsql oracle11g


    【解决方案1】:

    为确保发出正确的授权,请在引用函数时使用完全限定的 [schema].[object] 名称。否则,您将依赖指向正确对象的公共同义词。该功能必须存在才能授予它,尽管它可能不是有效状态。您不能对不存在的对象发出授权(除了 catch all EXECUTE ANY 授权,但这是一个特殊的数据库角色)。

    例如,如果架构是 FOOBAR 并且函数名称是 AGE 那么你会发出:

    GRANT EXECUTE ON foobar.age TO scott
    

    此外,在使用该功能时,请确保:

    1. 有一个公共同义词指向函数并且不存在隐藏公共同义词的本地同义词
    2. 或 .. 该函数有一个本地同义词(例如,SCOTT 有一个指向 FOOBAR.AGE 的本地同义词)
    3. 或...您通过其完全限定名称引用该函数(例如,通过FOOBAR.AGE() 调用它

    要检查函数本身是否有效,您可以查询ALL_OBJECTS 并检查STATUS 列:

    SELECT status
    FROM all_objects
    WHERE owner = 'FOOBAR'
      AND object_type = 'FUNCTION'
      AND object_name = 'AGE'
    

    【讨论】:

    • 感谢您的回答!我仍然想知道如何确保在发出授权命令之前必须存在一个函数?我的意思是我们不会将函数体保存在任何地方,而是通过简单地在 SQL Plus 上编写函数或创建“.sql”文件然后从 SQL Plus 命令执行它来运行函数。如果我在某个地方错了,请纠正我。谢谢!
    • 如果该函数不存在,则 grant 命令将失败,因此您可以测试该失败(sql*plus 将退出并出现错误)。如果您想以编程方式在不存在的情况下做一些不同的事情,那么您可以将all_objects 状态检查放在 PL/SQL 块中,当且仅当函数存在时动态发出授权。
    • 感谢您的回复!是的,如我的问题中所述,grant 命令确实失败了,但我想知道,为什么尽管在 SQL plus 命令中运行该函数时出现该错误,但我收到消息“函数已创建”消息?能否请您说明一下这个问题?
    • Oracle 允许您定义引用您无权使用的对象的函数/过程/包。如果您创建一个引用另一个函数(在不同模式中)的函数,则会发生类似的情况,然后撤销对该函数的授权(或删除对象)。您的新功能将处于无效状态,因此您无法执行它,但它仍然存在。如果您尝试编译它,您将收到与上述类似的错误。要测试您的函数是否有效,您也可以尝试通过ALTER FUNCTION foobar COMPILE 编译它。
    猜你喜欢
    • 2011-07-20
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 2012-12-22
    • 2020-08-13
    • 2019-07-10
    • 1970-01-01
    相关资源
    最近更新 更多