Sql Oracle虚拟专用数据库列限制
我正在尝试创建一个限制数据库访问的虚拟专用数据库。我一直在研究如何限制用户查看所有列。我的作业要求将用户限制为两列: 设计并实现一个限制数据库访问的虚拟专用数据库。您的设计应该基于两个列和两个表。(提示:其中col1=value1和col2=value2) 以下是我当前的DDL语句:Sql Oracle虚拟专用数据库列限制,sql,database,oracle,Sql,Database,Oracle,我正在尝试创建一个限制数据库访问的虚拟专用数据库。我一直在研究如何限制用户查看所有列。我的作业要求将用户限制为两列: 设计并实现一个限制数据库访问的虚拟专用数据库。您的设计应该基于两个列和两个表。(提示:其中col1=value1和col2=value2) 以下是我当前的DDL语句: CREATE OR REPLACE FUNCTION auth_client( v_schema IN VARCHAR2, v_objname IN VARCHAR2) RETURN VARCHAR2 AS
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_related_cols语句假定限制查询中除指定列以外的所有列,但所有列仍显示 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;
创建表vpd\u表
选择mod(2级)作为nr,双连接的lv级<100级;
从vpd_表中选择*;
创建或替换函数auth_函数(
VARCHAR2中的v_模式,
VARCHAR2中的v_objname)
返回VARCHAR2作为
con VARCHAR2(200);
开始
con:='nr=1';
返回(con);
结束;
/
开始
DBMS_RLS.ADD_策略(
对象名称=>'vpd\U表',
策略\u名称=>“客户端\u策略”,
策略函数=>“验证函数”,
第二节相关内容=>'nr',
sec_relevant_cols_opt=>dbms_rls.所有行);
结束;
/
开始
DBMS_RLS.DROP_策略(null、“vpd_表”、“客户端_策略”);
结束;
什么是重要的
sec\u relevant\u cols
-敏感列列表<代码>'col1 col2'或'col1,col2'-支持这两种格式
sec\u relevant\u cols\u opt
-仅使用sec\u relevant\u cols
。如果是dbms。所有行
-用于敏感列oracle,而不是原始值dispaly null。
/
若要从结果中删除列,则必须创建视图。并且只允许访问vie