使用Oracle VPD(Virtual Private Database)限制用户获取数据的范围_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 1959 | 回复: 0   主题: 使用Oracle VPD(Virtual Private Database)限制用户获取数据的范围        下一篇 
johnnyfox
注册用户
等级:新兵
经验:41
发帖:90
精华:0
注册:2011-12-12
状态:离线
发送短消息息给johnnyfox 加好友    发送短消息息给johnnyfox 发消息
发表于: IP:您无权察看 2015-6-25 14:19:06 | [全部帖] [楼主帖] 楼主

通过一个具体案例,体验一下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


--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论