在函数内部调用DBMS_RLS.ENABLE_POLICY?

时间:2013-10-27 04:02:29

标签: oracle oracle11g

我试图从包中定义的函数内部调用SYS.DBMS_RLS.ENABLE_POLICY()。 但它显示以下错误:

  

错误(19,16):PLS-00201:必须声明标识符'SYS.DBMS_RLS'

代码:

CREATE OR REPLACE PACKAGE BODY foopackage IS
    FUNCTION foobar RETURN t_table PIPELINED IS
    BEGIN
        EXECUTE(SYS.DBMS_RLS.ENABLE_POLICY( -- error in this line
            object_schema => 'foo',
            object_name => 'bar',
            policy_name =>'bar2',
            enable => FALSE
        ));
        -- some more code
        EXECUTE(SYS.DBMS_RLS.ENABLE_POLICY( -- error in this line
            object_schema => 'foo',
            object_name => 'bar',
            policy_name =>'bar2',
            enable => TRUE
        ));
        RETURN;
    END;
END foopackage;

1 个答案:

答案 0 :(得分:2)

首先,如果你想从程序B中调用程序A,则不需要使用EXECUTE(这样做会出错,因为没有EXECUTE程序)。只需调用其他程序即可。

CREATE OR REPLACE PACKAGE BODY foopackage IS
    FUNCTION foobar RETURN t_table PIPELINED IS
    BEGIN
        SYS.DBMS_RLS.ENABLE_POLICY( -- error in this line
            object_schema => 'foo',
            object_name => 'bar',
            policy_name =>'bar2',
            enable => FALSE
        );
        -- some more code
        SYS.DBMS_RLS.ENABLE_POLICY( -- error in this line
            object_schema => 'foo',
            object_name => 'bar',
            policy_name =>'bar2',
            enable => TRUE
        );
        RETURN;
    END;
END foopackage;

更正此错误可能会也可能不会解决问题。如果您仍然遇到编译错误,可能的问题是您正在创建定义者权限存储过程,但定义者(包的所有者)对EXECUTE包没有DBMS_RLS权限直接授予用户。通过角色授予的权限在定义者权限存储过程中不可用(尽管它们可能在会话中可用)。

退一步说,你似乎不太可能想要尝试执行发出DDL的进程调用并导致事务在函数内部提交。这将使非常难以调用函数,我认为这是你打算调用它的方式。你试图解决的问题是什么?如果您正在尝试编写绕过策略函数的代码,那么您真正想要做的就是修改策略函数,以便允许您的代码绕过它,例如在策略的上下文中设置覆盖函数使用(假设它使用上下文)或者通过授予包的所有者EXEMPT ACCESS POLICY权限或以其他方式将旁路功能编码到策略函数本身。