我试图从包中定义的函数内部调用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;
答案 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
权限或以其他方式将旁路功能编码到策略函数本身。