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.