0

我试图创建一个像这样的简单函数,但它不起作用。返回数据,但与没有策略相同。

CREATE OR REPLACE FUNCTION test (schema in varchar2, tab in varchar2)
RETURN varchar2 AS
   predicate varchar2(4000);
   pre2 VARCHAR2(2000);
BEGIN
   pre2 := sa_session.SA_USER_NAME('policy');
   predicate := '"USER" = '''|| pre2 ||'''';
   return (predicate);
END test;
/

我会将此函数与 VPD 策略一起使用,因此当用户从表中选择时,他们只能选择他们的行。

4

1 回答 1

0

问题是这样的:

“我执行查询 SELECT sa_session.sa_user_name('policy') FROM DUAL;它返回我正在使用的数据库用户的用户名”

USER 是 SQL 伪列,它也返回“数据库用户的用户名”。所以基本上你的谓词评估为......

where 1 = 1

...就是它不限制结果集的原因。

您需要一个将策略名称应用于表列的谓词。因此,如果您的表列是 USER_NAME,它将是:

BEGIN
   pre2 := sa_session.SA_USER_NAME('policy');
   predicate := ' user_name = '''|| pre2 ||'''';
   return (predicate);
END test;

现在也许你的表有 USER 作为列名。那将是不幸的(并且是非常糟糕的做法),但是您可以通过以下方式挽救这种情况:

BEGIN
   pre2 := sa_session.SA_USER_NAME('policy');
   predicate := tab||'.user = '''|| pre2 ||'''';
   return (predicate);
END test; 
于 2013-06-12T19:04:52.350 回答