首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

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

2012-02-20 
ORACLE 精细访问控制的问题这是我做ORACLE 精细访问控制的实现的步骤,我要实现:scott用户登录后,只能查询

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 ~~

热点排行