ORA 904-错误编译函数,引用来自另一个模式的函数 - 已执行特权



我正在获取" 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

特权必须是直接的(未授予ROLE(。

如果您更改了赠款:

GRANT EXECUTE ON schema_b.proc_b TO run_query
/

to:

GRANT EXECUTE ON schema_b.proc_b TO schema_a;
/

schema_a中的因程序应编译。

最新更新