日期:2014-05-16  浏览次数:20732 次

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.