阻止当前用户查看他们的记录? VPD - ORACL12C

时间:2017-03-28 02:03:01

标签: oracle security oracle12c vpd

我正在尝试创建一个阻止当前登录用户在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;
/

2 个答案:

答案 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'') ';