Oracle VPD列限制

时间:2017-02-13 18:23:32

标签: sql database oracle

我正在尝试创建一个限制数据库访问的虚拟专用数据库。我坚持如何限制用户查看所有列。我的作业要求将用户限制为两列:

设计并实现限制数据库访问的虚拟专用数据库。您的设计应基于两个列和两个表。 (提示:其中col1 = value1 AND col2 = value2)。

以下是我目前的DDL声明:

CREATE OR REPLACE FUNCTION auth_client(
 v_schema IN VARCHAR2,
 v_objname IN VARCHAR2)
 RETURN VARCHAR2 AS
 con VARCHAR2 (200); 
BEGIN 
 con := 'SALES_REP_ID = 4111';
 RETURN (con); 
END auth_client; 
/

BEGIN 
 DBMS_RLS.ADD_POLICY (
 object_schema => 'general_manager', 
 object_name => 'client', 
 policy_name => 'client_policy', 
 policy_function => 'auth_client',
 sec_relevant_cols => 'sales_rep_id'); 
END; 
/

根据我的理解,sec_relevant_cols语句假设限制查询中除指定列之外的所有列,但仍显示所有列。

1 个答案:

答案 0 :(得分:2)

VPD只允许您隐藏列中的值而不从结果中删除列;

create table vpd_table 
as select mod(level,2) as nr,level lv from dual connect by level < 100;

select * from vpd_table;


CREATE OR REPLACE FUNCTION auth_function(
 v_schema IN VARCHAR2,
 v_objname IN VARCHAR2)
 RETURN VARCHAR2 AS
 con VARCHAR2 (200); 
BEGIN 
 con := 'nr = 1';
 RETURN (con); 
END ; 
/

BEGIN 
 DBMS_RLS.ADD_POLICY (
 object_name => 'vpd_table', 
 policy_name => 'client_policy', 
 policy_function => 'auth_function',
 sec_relevant_cols => 'nr', 
 sec_relevant_cols_opt => dbms_rls.ALL_ROWS); 
END; 
/

begin 
DBMS_RLS.DROP_POLICY(null, 'vpd_table', 'client_policy');
end;

重要的是什么。

sec_relevant_cols - 敏感列的列表。 'col1 col2' or 'col1,col2' - 支持这两种格式。

sec_relevant_cols_opt - 仅适用于sec_relevant_cols。如果是dbms_rls.ALL_ROWS - 对于敏感列oracle而言,orignals值显示为null。 /

如果你想要从结果中删除列,你必须创建视图。并且仅授予访问权限。