secooler 快乐的DBA

Oracle ACE Director | 10g 11g OCM | OCM联盟(OCMU.org)发起人 | ACOUG Core Member

  • 博客访问: 1392682
  • 博文数量: 803
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-16 22:27
个人简介

Oracle ACE Director,OCM联盟(ocmu.org)创始人,恩墨学院(enmoedu.com)创始人,ITPUB Oracle专题深入讨论版版主,资深Oracle数据库专家,北京大学理学硕士,获Oracle OCM 10g 11g认证,ACOUG核心成员,DATAGURU专家团成员,Blogger。Good luck.

文章分类

全部博文(803)

文章存档

2013年(1)

2012年(21)

2011年(156)

2010年(302)

2009年(310)

2008年(7)

2007年(5)

订阅

分类: Linux

VPD全称Virtual Private Database,这个技术提供了对数据库信息的细粒度访问控制。关于VPD的更多描述性信息可通过Oracle官方文档获得:http://download.oracle.com/docs/cd/B19306_01/network.102/b14266/apdvpoli.htm#i1009600
通过一个具体案例,体验一下VPD带给我们的功能特点。

1.初始化环境
构造表T,其中包含一个字段X。
sec@ora10g> create table t (x number);
sec@ora10g> insert into t values (1);
sec@ora10g> insert into t values (2);
sec@ora10g> insert into t values (10001);
sec@ora10g> insert into t values (10002);
sec@ora10g> commit;
sec@ora10g> select * from t;

         X
----------
         1
         2
     10001
     10002

2.问题场景描述
禁止查询T表中X列值大于10000的数据。

3.实现方法一:使用视图
这种方法可能是大家都很容易想到的,实现起来相对简单。但无法真正做到禁止访问基础表。
sec@ora10g> create view v_t as select * from t where x <=10000;

View created.

sec@ora10g> select * from v_t;

         X
----------
         1
         2

此时如果直接查询基础表t,仍然可以获得说有的数据。
sec@ora10g> select * from t;

         X
----------
         1
         2
     10001
     10002

4.实现方法二:使用VPD
1)创建VPD需要的函数,这里给出的名字是f_limited_query_t。
CREATE OR REPLACE FUNCTION f_limited_query_t (s_schema IN VARCHAR2,
                                              s_object IN VARCHAR2)
   RETURN VARCHAR2
AS
BEGIN
   RETURN 'X <= 10000';
END;
/

Function created.

2)将函数与需要保护的表进行关联
BEGIN
   DBMS_RLS.add_policy (object_schema   => 'SEC',
                        object_name     => 'T',
                        policy_name     => 'POLICY_LIMITED_QUERY_T',
                        function_schema => 'SEC',
                        policy_function => 'F_LIMITED_QUERY_T');
END;
/

PL/SQL procedure successfully completed.

3)验证VPD效果
此时在sec用户下直接查询t表,获得的也仅仅是我们要求的数据范围。
sec@ora10g> select * from t;

         X
----------
         1
         2

即便是连接到其他用户依然无法获得sec用户下t表隐藏掉的数据。
sec@ora10g> conn secooler/secooler
Connected.
secooler@ora10g> select * from sec.t;

         X
----------
         1
         2

只有sys用户有权查看到sec用户下t表的全部数据
sec@ora10g> conn / as sysdba
Connected.
sys@ora10g> select * from sec.t;

         X
----------
         1
         2
     10001
     10002

4)去掉VPD对数据访问的限制
我们可以使用DBMS_RLS.drop_policy来完成这个任务。
secooler@ora10g> conn sec/sec
Connected.

BEGIN
   DBMS_RLS.drop_policy (object_schema   => 'SEC',
                         object_name     => 'T',
                         policy_name     => 'POLICY_LIMITED_QUERY_T');
END;
/

PL/SQL procedure successfully completed.

此时可获得T表的全部数据
sec@ora10g> select * from t;

         X
----------
         1
         2
     10001
     10002

5.小结
这里给出的是VPD最简单的一种使用方法,在实际应用中需求可能会比较复杂,但通过分析并仔细定制,VPD都可以胜任。
欢迎大家分享关于VPD技术的具体应用案例。

Good luck.

secooler
10.09.07

-- The End --

阅读(953) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~

pan_tian2012-07-24 11:06:54

非常棒的Case,简单易于理解

评论热议
请登录后评论。

登录 注册