【发布时间】:2021-02-28 08:14:18
【问题描述】:
我正在学习 Oracle,我正在尝试将行级安全性添加到演示中 桌子。我可以成功运行第一个示例:
CREATE OR REPLACE FUNCTION get_emp_pred
(schema_v IN VARCHAR2, tbl_v IN VARCHAR2) RETURN VARCHAR2 IS
BEGIN
RETURN 'upper(ename) = SYS_CONTEXT(''USERENV'', ''CURRENT_USER'')
OR upper(manager) = SYS_CONTEXT(''USERENV'', ''CURRENT_USER'')';
END;
BEGIN
SYS.DBMS_RLS.ADD_POLICY(
object_schema => 'hector',
object_name => 'emp',
policy_name => 'emp_vpd1',
function_schema => 'vpdadmin',
policy_function => 'get_emp_pred',
statement_types => 'select'
);
END;
在此示例中,每个用户都可以看到列“ename”或列“manager”所在的行 value 匹配他自己的用户名。现在我的问题是当我尝试过滤时 不是由用户在列中进行比较,而是针对某些任意列值(例如国家/地区或 薪水。例如,我想向 Bob 显示薪水 > 1000 的行,向 Anne 其中薪水
我尝试了这个函数和其他变体但没有结果:
CREATE OR REPLACE FUNCTION get_emp_pred
(schema_v IN VARCHAR2, tbl_v IN VARCHAR2) RETURN VARCHAR2 AS
l_predicate VARCHAR2(100);
BEGIN
IF 'BOB' = SYS_CONTEXT('USERENV', 'CURRENT_USER') THEN
l_predicate := 'salary > 1000';
ELSIF 'ANNE' = SYS_CONTEXT('USERENV', 'CURRENT_USER') THEN
l_predicate := 'salary < 1000';
ELSE
l_predicate := '1=1';
END IF;
RETURN l_predicate;
END;
我想你不能在运行时评估这个条件,但如果我写一个 每个用户的策略和谓词都不起作用。例如这个 其政策适用于 Bob,其他适用于 Anne,等等:
CREATE OR REPLACE FUNCTION get_emp_pred_bob
(schema_v IN VARCHAR2, tbl_v IN VARCHAR2) RETURN VARCHAR2 IS
BEGIN
RETURN '''BOB'' = SYS_CONTEXT(''USERENV'', ''CURRENT_USER'') AND salary > 1000';
END;
如果我只有 Bob 策略,它适用于 Bob 并为其他用户返回 0 行, 但是当我为 Anne 添加第二个策略时,每个人都得到 0 行,也许是因为 policyBob && policyAnne 总是返回 false。
我想知道这种过滤是否可行。
【问题讨论】: