0

我正在尝试创建一个函数,以防止当前登录的用户在 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;
/
4

2 回答 2

1

“我的函数返回语句是......但这不起作用”

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

“在 return 语句中添加多个引号会编译带有错误的函数。”

你没有说你得到了什么错误,但我猜ORA-00984: column not allowed here。那是因为current_user()它不是一个有效的 Oracle 数据库函数(我认为 JDBC 支持它,但这是不同的)。

你需要的是用户。试试这个功能,它会为你工作:

create or replace function banself(
    p_schema in varchar2,
    p_object in varchar2)
return varchar2 as
begin
    return 'ename != USER';
end;
/
于 2017-03-28T06:35:15.993 回答
0

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

您必须将退货声明更改为。 return 'ename != DBMS_UTILITY.OLD_CURRENT_USER '; 或者 return 'ename != sys_context (''userenv'', ''current_user'') ';

于 2017-03-28T06:39:57.933 回答