读书人

ORACLE 精细访问控制的有关问题

发布时间: 2012-02-20 21:18:25 作者: rapoo

ORACLE 精细访问控制的问题
这是我做ORACLE 精细访问控制的实现的步骤,我要实现:scott用户登录后,只能查询部门10的人员的信息,并不能更改任何部门、任何人员的信息和system用户登录后,只能查询部门10和20的人员的信息,并能更改部门20的数据。

麻烦大侠看下,谢谢哈!
到最后一步测试不成功啊!!!

SQL> conn sys/zhou14@practice as sysdba

已连接。



创建自定义应用环境:

SQL> create or replace context empenv using scott.emp_ctx;



上下文已创建。



创建包来设置应用环境的属性:

SQL> create or replace package scott.emp_ctx as

2 procedure set_deptno;

3 end;

4 /



程序包已创建。



SQL>create or replace package body scott.emp_ctx as

2 procedure set_deptno is

3 begin

4 if sys_context('userenv','session_user')='scott' then

5 dbms_session.set_context('empenv','scott_attr1','10');

6 elsif sys_context('userenv','session_user')='system' then

7 dbms_session.set_context('empenv','system_attr1','10');

8 dbms_session.set_context('empenv','system_attr2','20');

9 end if;

10 end;

11* end;

SQL> /



程序包体已创建。



创建安全策略函数:



SQL> create or replace package scott.emp_security as

2 function select_imt(oblect_schema varchar2,object_name varchar2)return varc

har2;

3 function update_imt(oblect_schema varchar2,object_name varchar2)return varc

har2;

4 end;

5 /



程序包已创建。



SQL> create or replace package body scott.emp_security as

2 function select_imt(oblect_schema varchar2,object_name varchar2)return varc

har2 is

3 rtn_predicate varchar2(500);

4 begin

5 rtn_predicate:= '1=1';

6 if user='scott' then

7 rtn_predicate:='deptno=sys_context("empenv","scott_attr1")';

8 elsif user='system' then

9 rtn_predicate:='deptno=sys_context("empenv","system_attr1")' || 'or' ||

10 'deptno=sys_context("empenv","system_attr2")';

11 end if;

12 return rtn_predicate;

13 end;

14 function update_imt(oblect_schema varchar2,object_name varchar2)return varc

har2 is

15 rtn_predicate varchar2(500);

16 begin

17 rtn_predicate:='1=2';

18 if user='system' then

19 rtn_predicate:='deptno=sys_context("empenv","system_attr2")';

20 end if;

21 return rtn_predicate;

22 end;

23* end;

SQL> /



程序包体已创建。





将安全策略函数关联到表或视图:



SQL> execute dbms_rls.add_policy( -

> object_schema=> 'scott',-

> object_name=>'emp',-

> policy_name=>'select_policy',-

> function_schema=>'scott',-

> policy_function=>'emp_security.select_imt',-

> statement_types=>'select');



PL/SQL 过程已成功完成。



SQL> execute dbms_rls.add_policy( -

> object_schema=> 'scott',-

> object_name=>'emp',-

> policy_name=>'update_policy',-

> function_schema=>'scott',-

> policy_function=>'emp_security.update_imt',-

> statement_types=>'insert,update,delete');



PL/SQL 过程已成功完成。





创建登录触发器:



SQL> create or replace trigger logon_trig

2 after logon on database call scott.emp_ctx.set_deptno

3 /



触发器已创建





验证精细访问控制效果:(未成功)


测试:scott用户登录后,只能查询部门10的人员的信息,并不能更改任何部门、任何人员的信息,结果选出来的是所有部门,错误啊!是不是上面出错呢?请帮我看看、、、

SQL> conn scott/zhou14@practice

已连接。

SQL> set pagesize 40 linesize 120

SQL> select * from emp;



EMPNO ENAME JOB MGR HIREDATE SAL

DEPTNO

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

----------

7369 SMITH CLERK 7902 17-12月-80 800

20

7499 ALLEN SALESMAN 7698 20-2月 -81 1600

30

7521 WARD SALESMAN 7698 22-2月 -81 1250

30

7566 JONES MANAGER 7839 02-4月 -81 2975

20

7654 MARTIN SALESMAN 7698 28-9月 -81 1250

30

7698 BLAKE MANAGER 7839 01-5月 -81 2850

30

7782 CLARK MANAGER 7839 09-6月 -81 2450

10

7788 SCOTT ANALYST 7566 19-4月 -87 3000

20

7839 KING PRESIDENT 17-11月-81 5000

10

7844 TURNER SALESMAN 7698 08-9月 -81 1500

30

7876 ADAMS CLERK 7788 23-5月 -87 1100

20

7900 JAMES CLERK 7698 03-12月-81 950

30

7902 FORD ANALYST 7566 03-12月-81 3000

20

7934 MILLER CLERK 7782 23-1月 -82 1300

10



已选择14行。






[解决办法]
高级。。。。。。
[解决办法]
mark ~~

读书人网 >oracle

热点推荐