Oracle 的虚拟私有 数据库特性(也称作细颗粒度存取控制)对诸如 SELECT等数据管理语言 DML语句提供行级安全性检查。
PL/SQL策略函数和某个数据表相关联,这个 函数可以检查当前用户的上下文背景并添加查询中 WHERE语句的条件(断言),一个用户或者应用可以这样来写:
SELECT * FROM employees;
但是实际上 Oracle将会执行这样的语句:
SELECT * FROM employees
WHERE department_id = 60;
因此,只有在查寻范围之内的行(在 department数据表中的前 60行)才会被查询语句返回。利用 oracle 10g中的新选项可以让 Oracle返回所有行,而不仅仅是被授权的行。然而,未被授权行中包含的某些列(称为安全相关列)将显示 NULL来代替实际数据,而其它的列值将会正常显示。
要想使用列值掩码必须在虚拟私有 数据库策略中做两件事。
首先必须创建一个列级策略来设计某些列为安全相关列 .其次必须在查询中包含 ALL_ROWS选项以用来返回所有行。这两个参数的结合就可以实现列值掩码。
CREATE OR REPLACE
FUNCTION rls_dept
(obj_owner IN VARCHAR2, obj_name IN VARCHAR2)
RETURN VARCHAR2
AS
predicate
VARCHAR2 (200);
BEGIN
predicate := ''department_id = 60'';
RETURN (predicate);
END rls_dept;
/
列表 A
列表 A显示了一个称为 rls_dept的策略函数。它返回断言 “department_id= 60”,用来设定对于 EMPLOYEES表中 60行之内的 department字段。(实际上,这个 函数并不返回一个静态表,它可以确定当前用户是谁,并据此返回给该用户正确的部门值。)
BEGIN
DBMS_RLS.ADD_POLICY(object_schema=>''HR'',
object_name= > ''EMPLOYEES'',
policy_name=> ''restrict_dept_policy'',
function_schema=> ''HR'',
policy_function=> ''rls_dept'',
sec_relevant_cols=> ''salary,commission_pct'',
sec_relevant_cols_opt=> dbms_rls.ALL_ROWS);
END;
/
列表 B
列表 B显示了如何应用列表 A中的函数创建列值掩码。在 DBMS_RLS包中的过程 ADD_POLICY创建一个称为 restrict_dept_policy的新策略。参数 sec_relevant_cols表明字段 salary和 commission_pct是安全相关列。一个包含上述两个字段的查询将会应用到该策略 函数,