我正在尝试创建一个限制数据库访问的虚拟专用数据库。我坚持如何限制用户查看所有列。我的作业要求将用户限制为两列:
设计并实现限制数据库访问的虚拟专用数据库。您的设计应基于两个列和两个表。 (提示:其中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语句假设限制查询中除指定列之外的所有列,但仍显示所有列。
答案 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。
/
如果你想要从结果中删除列,你必须创建视图。并且仅授予访问权限。