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

Prevent current user from seeing their record? VPD - ORACL12C

我正在尝试创建一个功能,以防止当前登录的用户在 scott.emp table.

中查看他们自己的记录

我已经编写了一个函数来执行该策略。当前 return 语句是 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;
/

"my function return statement is ... however this does not work"

您当前的函数正在返回一个固定的字符串。除非您的 table 有一个名为 CURRENT_USER 的列,否则它总是会引发运行时错误。

"Putting multiple quotes in the return statement compiles the function with errors."

你没有说你得到了什么错误,但我猜 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;
/

CURRENT_USER 可通过 sys_context('userenv'、'current_user')或函数 DBMS_UTILITY.OLD_CURRENT_USER 访问。

您必须将 return 语句更改为。 return 'ename != DBMS_UTILITY.OLD_CURRENT_USER '; 要么 return 'ename != sys_context (''userenv'', ''current_user'') ';