bys是个DBA用户。数据库版本:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

1.创建函数 hide_sal_comm 和策略。

SCOTT@ bys001>conn bys/bys
 Connected.

 create or replace function hide_sal_comm(v_schema varchar2,v_object varchar2)
 return varchar2 as com varchar2(200);
 begin
 com:='deptno=30';
 return(com);
 end hide_sal_comm;
 /

 begin
 dbms_rls.add_policy (
 object_schema =>'scott',
 object_name =>'emp',
 policy_name =>'hide_sal_policy',
 policy_function =>'hide_sal_comm',
 sec_relevant_cols =>'sal,comm');
 end;
 /

2.进行查询,验证上面的限制

查询的字段中中涉及comm,sal字段,默认加上条件 where deptno=30

SCOTT@ bys001>select deptno,empno,comm,sal  from emp;


    DEPTNO      EMPNO       COMM        SAL


---------- ---------- ---------- ----------


        30       7499        300       1600


        30       7521        500       1250


        30       7654       1400       1250


        30       7698                  2850


        30       7844          0       1500


        30       7900                   950


6 rows selected.


查询的字段中涉及comm,sal字段之一,默认同样会加上条件 where deptno=30

SCOTT@ bys001>select deptno,empno,comm  from emp;


    DEPTNO      EMPNO       COMM


---------- ---------- ----------


        30       7499        300


        30       7521        500


        30       7654       1400


        30       7698


        30       7844          0


        30       7900


6 rows selected.


查询的字段中不涉及comm,sal字段,查出整张表的。

SCOTT@ bys001>select deptno,empno  from emp;


    DEPTNO      EMPNO


---------- ----------


        20       7369


        30       7499


        30       7521


        20       7566


        30       7654


        30       7698


        10       7782


        20       7788


        10       7839


        30       7844


        20       7876


        30       7900


        20       7902


        10       7934


14 rows selected.


#################################################################################


3.删除策略,并新建策略,对需要隐藏的列以NULL显示

查询的字段中涉及comm,sal字段,14行都可以显示,非deptno=30的行中的comm,sal字段被NULL取代

BYS@ bys001>exec dbms_rls.drop_policy('scott','emp','hide_sal_policy');

 PL/SQL procedure successfully completed.


 begin

 dbms_rls.add_policy (

 object_schema =>'scott',

 object_name =>'emp',

 policy_name =>'hide_sal_policy',

 policy_function =>'hide_sal_comm',

 sec_relevant_cols =>'sal,comm',

 sec_relevant_cols_opt => dbms_rls.all_rows);

 end;

 /


 BYS@ bys001>conn scott/tiger

 Connected.

SCOTT@ bys001>select deptno,empno,comm,sal  from emp order by deptno;


    DEPTNO      EMPNO       COMM        SAL


---------- ---------- ---------- ----------


        10       7782


        10       7839


        10       7934


        20       7566


        20       7902


        20       7876


        20       7369


        20       7788


        30       7521        500       1250


        30       7844          0       1500


        30       7499        300       1600


        30       7900                   950


        30       7698                  2850


        30       7654       1400       1250


14 rows selected.


查询的字段中涉及comm,sal字段之一。14行都可以显示,非deptno=30的行中的comm,sal字段被NULL取代

SCOTT@ bys001>select deptno,empno,comm  from emp order by deptno;


    DEPTNO      EMPNO       COMM


---------- ---------- ----------


        10       7782


        10       7839


        10       7934


        20       7566


        20       7902


        20       7876


        20       7369


        20       7788


        30       7521        500


        30       7844          0


        30       7499        300


        30       7900


        30       7698


        30       7654       1400


14 rows selected.


查询的字段中不涉及comm,sal字段

SCOTT@ bys001>select deptno,empno  from emp order by deptno desc;


    DEPTNO      EMPNO


---------- ----------


        30       7698


        30       7844


        30       7499


        30       7654


        30       7521


        30       7900


        20       7788


        20       7566


        20       7369


        20       7876


        20       7902


        10       7839


        10       7934


        10       7782


14 rows selected.



#################################################


4.清除策略后查询可以正常显示

BYS@ bys001>exec dbms_rls.drop_policy('scott','emp','hide_sal_policy');


PL/SQL procedure successfully completed.


BYS@ bys001>conn scott/tiger


Connected.


SCOTT@ bys001>select deptno,empno,comm,sal  from emp order by deptno;


    DEPTNO      EMPNO       COMM        SAL


---------- ---------- ---------- ----------


        10       7782                  2450


        10       7839                  5000


        10       7934                  1300


        20       7566                  2975


        20       7902                  3000


        20       7876                  1100


        20       7369                   800


        20       7788                  3000


        30       7521        500       1250


        30       7844          0       1500


        30       7499        300       1600


        30       7900                   950


        30       7698                  2850


        30       7654       1400       1250


14 rows selected.