【问题标题】:ORA 904 - Error compiling function that references function from another schema - has execute privilegeORA 904 - 编译从另一个模式引用函数的函数时出错 - 具有执行权限
【发布时间】:2026-01-09 04:50:01
【问题描述】:

尝试在我的架构中的函数内使用来自另一个架构的函数时,我收到“ORA-00904 无效标识符”错误。我正在使用函数的完全限定名称,并且通过授予的角色对函数具有执行权限。

直接从我的架构中执行该函数是可行的。但是从我的架构中的函数调用该函数不会,并且会出现 904 错误。

示例:

我正在尝试在一个名为 schema_A 的模式中编译一个名为 proc_A 的过程。

proc_A 使用来自 schema_B 的名为 proc_B 的函数的输出。

schema_A 可以通过角色访问 proc_B。 schema_A 能够直接运行 proc_B,但不能在函数/过程中使用它。在过程中使用它会导致编译失败。

下面是演示问题的代码示例:

CREATE OR REPLACE FUNCTION schema_b.proc_b
RETURN  DATE IS
BEGIN
    RETURN sysdate;
END;
/


CREATE ROLE run_query
/


GRANT EXECUTE ON schema_b.proc_b TO run_query
/
GRANT run_query TO schema_a
/



-- this will fail to compile with the ORA-904 invalid identifier error
CREATE OR REPLACE FUNCTION schema_a.proc_a
RETURN NUMBER IS
BEGIN
    FOR c IN (SELECT schema_b.proc_b() FROM dual) LOOP --> this function call causes the error
        NULL;
    END LOOP;
    RETURN 5;
END;
/

运行 Oracle 11g R2

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    权限必须是直接的(不授予ROLE)。

    如果您将授权更改为:

    GRANT EXECUTE ON schema_b.proc_b TO run_query
    /
    

    收件人:

    GRANT EXECUTE ON schema_b.proc_b TO schema_a;
    /
    

    schema_a 中的依赖过程应该可以编译。

    【讨论】:

    • 确实有效。我认为角色的全部意义在于您不需要单独授予权限?
    • 谢谢@ngundling 是的,它可能需要一些时间来适应。但这是设计使然——角色在某些情况下有效,但并不等同于直接授予,并且像这样的对象依赖关系需要后者。我认为 Tom Kyte 在这里很好地描述了要求的原因:asktom.oracle.com/pls/asktom/…
    • 角色用于管理最终用户组,可以即时启用和禁用。 PL/SQL 编译器需要更具体的东西。
    最近更新 更多