SQL> create table access_policy as select ename,deptno from scott.emp;
Table created
SQL> select * from access_policy;
ENAME DEPTNO
---------- ------
SMITH 20
ALLEN 30
WARD 30
JONES 20
MARTIN 30
BLAKE 30
CLARK 10
KING 10
TURNER 30
JAMES 30
FORD 20
MILLER 10
12 rows selected
SQL> insert into access_policy values('SMITH',10);
1 row inserted
SQL> commit;
Commit complete
create or replace function get_user_dept_id
(
p_schema in varchar2,
p_table in varchar2
)
return varchar2
as
l_retstr varchar2(2000);
begin
if (p_schema = user) then
l_retstr := null;
else
for user_rec in
(
select deptno
from access_policy
where ename = USER
) loop
l_retstr := l_retstr||','||user_rec.deptno;
end loop;
l_retstr := ltrim(l_retstr,',');
if (l_retstr is null) then
l_retstr := '1=2';
else
l_retstr := 'DEPTNO IN ('||l_retstr||')';
end if;
end if;
return l_retstr;
end;SQL> select kamus.get_user_dept_id('SCOTT','EMP') from dual;
KAMUS.GET_USER_DEPT_ID('SCOTT'
--------------------------------------------------------------------------------
DEPTNO IN (20,10)
begin
dbms_rls.add_policy (
object_schema => 'SCOTT',
object_name => 'EMP',
policy_name => 'EMP_SEL_POLICY',
function_schema => 'KAMUS',
policy_function => 'GET_USER_DEPT_ID',
statement_types => 'SELECT'
);
end;
/
begin
dbms_rls.add_policy (
object_schema => 'SCOTT',
object_name => 'EMP',
policy_name => 'EMP_IUD_POLICY',
function_schema => 'KAMUS',
policy_function => 'GET_USER_DEPT_ID',
statement_types => 'INSERT, UPDATE, DELETE',
update_check => TRUE
);
end;
/
SQL> conn scott/tiger
已连接。
--SCOTT用户可以选择出全部的12条记录
SQL> select count(*) from emp;
COUNT(*)
----------
12
SQL> conn smith/smith
已连接。
--SMITH用户只能选择出属于10,20部门的6条记录
SQL> select count(*) from scott.emp;
COUNT(*)
----------
6
--更新也只能更新6行记录
SQL> update scott.emp set sal=sal+100;
已更新6行。
--如果尝试插入一个其它部门的员工将会报错
SQL> insert into scott.emp(empno,ename,deptno) values(9999,'VPD',30);
insert into scott.emp(empno,ename,deptno) values(9999,'VPD',30)
*
第 1 行出现错误:
ORA-28115: 策略违反检验选项
--即使指定了要更新30部门的数据也是一条都无法更新
SQL> update scott.emp set sal=sal+100 where deptno=30;
已更新0行。
--同样删除也只能删除6行数据
SQL> delete scott.emp;
已删除6行。
'来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/8225414/viewspace-899034/ ,如需转载,请注明出处,否则将追究法律责任。