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.