我正在尝试创建一个阻止当前登录用户在scott.emp表中查看自己记录的函数。
我写了一个强制执行政策的功能。目前返回语句为return 'ename != CURRENT_USER';
但是这不起作用。
我不确定是否必须添加新的函数参数,或者我只需要更改return语句。在return语句中放置多个引号会编译带有错误的函数。我缺少格式化吗?
create or replace function self(
p_schema in varchar2,
p_object in varchar2)
return varchar2 as
begin
return 'ename != CURRENT_USER';
end;
/
begin
dbms_rls.add_policy
(object_schema => 'SCOTT',
object_name => 'EMP',
policy_name => 'self',
policy_function => 'self');
end;
/
答案 0 :(得分:1)
"我的函数return语句是......但是这不起作用"
您当前的函数返回固定字符串。除非您的表有一个名为CURRENT_USER
的列,否则它总是会抛出运行时错误。
"在return语句中放置多个引号会编译带错误的函数。"
你不会说出你得到的错误,但我猜错ORA-00984: column not allowed here
。那是因为current_user()
不是一个有效的Oracle数据库函数(我认为它在JDBC中是受支持的,但这是不同的)。
您需要的是USER。尝试这个功能,它适合你:
create or replace function banself(
p_schema in varchar2,
p_object in varchar2)
return varchar2 as
begin
return 'ename != USER';
end;
/
答案 1 :(得分:0)
可以使用sys_context('userenv','current_user')或函数DBMS_UTILITY.OLD_CURRENT_USER访问CURRENT_USER。
您必须将退货状态更改为。
return 'ename != DBMS_UTILITY.OLD_CURRENT_USER ';
要么
return 'ename != sys_context (''userenv'', ''current_user'') ';