<table class="text">
<tr class="li1"><td class="ln"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131 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技术的具体应用案例。 原文地址:http://www.cnblogs.com/benio/archive/2011/03/01/1967998.html 原文链接:https://www.f2er.com/note/421115.html