通过VPD策略的设置,David只能够查看部门60和80的记录。

SQL> conn david
Enter password: 
Connected.
SQL> select employee_id,salary,first_name from hr.employees;

EMPLOYEE_ID SALARY FIRST_NAME
----------- ---------- --------------------
103 9000 Alexander
104 6000 Bruce
105 4800 David
106 4800 Valli
107 4200 Diana
145 14000 John
146 13500 Karen
147 12000 Alberto
148 11000 Gerald
149 10500 Eleni
150 10000 Peter

EMPLOYEE_ID SALARY FIRST_NAME
----------- ---------- --------------------
151 9500 David
152 9000 Peter
153 8000 Christopher
154 7500 Nanette
155 7000 Oliver
156 10000 Janette
157 9500 Patrick
158 9000 Allan
159 8000 Lindsey
160 7500 Louise
161 7000 Sarath

EMPLOYEE_ID SALARY FIRST_NAME
----------- ---------- --------------------
162 10500 Clara
163 9500 Danielle
164 7200 Mattea
165 6800 David
166 6400 Sundar
167 6200 Amit
168 11500 Lisa
169 10000 Harrison
170 9600 Tayler
171 7400 William
172 7300 Elizabeth

EMPLOYEE_ID SALARY FIRST_NAME
----------- ---------- --------------------
173 6100 Sundita
174 11000 Ellen
175 8800 Alyssa
176 8600 Jonathon
177 8400 Jack
179 6200 Charles

39 rows selected.

其实,有时候不必全部隐藏,可能只要不能看到其他部门的薪水就OK了。
那么,VPD在这种需求下怎么办呢?
VPD在Oracle10G中引入了一个叫做敏感列VPD的新特性,这个功能可以在某个列被访问时激活安全保护策略。
下面看例子:

SQL> conn hr
Enter password: 
Connected.

--删除掉原来的策略
SQL> declare
2 begin
3 dbms_rls.drop_policy(
4 object_schema =>'HR',
5 object_name =>'EMPLOYEES',
6 policy_name =>'HIDE_EMP');
7 end;
8 /

PL/SQL procedure successfully completed.

--然后修改:vi test_add_policy.sql 
declare
begin
dbms_rls.add_policy(
object_schema =>'HR',
object_name =>'EMPLOYEES',
policy_name =>'HIDE_EMP',
function_schema =>'HR',
policy_function =>'TEST_VPD',
statement_types =>'SELECT',
sec_relevant_cols =>'SALARY',
SEC_RELEVANT_COLS_OPT =>dbms_rls.all_rows
);
end;

SQL> @test_add_policy

PL/SQL procedure successfully completed.

让我们来看看效果:
SQL> conn david
Enter password: 
Connected.
SQL> select employee_id,department_id,salary from hr.employees;

EMPLOYEE_ID DEPARTMENT_ID SALARY
----------- ------------- ----------
198 50
199 50
200 10
201 20
202 20
203 40
204 70
205 110
206 110
100 90
101 90

EMPLOYEE_ID DEPARTMENT_ID SALARY
----------- ------------- ----------
102 90
103 60 9000
104 60 6000
105 60 4800
106 60 4800
107 60 4200
108 100
109 100
110 100
111 100
112 100

EMPLOYEE_ID DEPARTMENT_ID SALARY
----------- ------------- ----------
113 100
114 30
115 30
116 30
117 30
118 30
119 30
120 50
121 50
122 50
123 50

EMPLOYEE_ID DEPARTMENT_ID SALARY
----------- ------------- ----------
124 50
125 50
126 50
127 50
128 50
129 50
130 50
131 50
132 50
133 50
134 50

EMPLOYEE_ID DEPARTMENT_ID SALARY
----------- ------------- ----------
135 50
136 50
137 50
138 50
139 50
140 50
141 50
142 50
143 50
144 50
145 80 14000

EMPLOYEE_ID DEPARTMENT_ID SALARY
----------- ------------- ----------
146 80 13500
147 80 12000
148 80 11000
149 80 10500
150 80 10000
151 80 9500
152 80 9000
153 80 8000
154 80 7500
155 80 7000
156 80 10000

EMPLOYEE_ID DEPARTMENT_ID SALARY
----------- ------------- ----------
157 80 9500
158 80 9000
159 80 8000
160 80 7500
161 80 7000
162 80 10500
163 80 9500
164 80 7200
165 80 6800
166 80 6400
167 80 6200

EMPLOYEE_ID DEPARTMENT_ID SALARY
----------- ------------- ----------
168 80 11500
169 80 10000
170 80 9600
171 80 7400
172 80 7300
173 80 6100
174 80 11000
175 80 8800
176 80 8600
177 80 8400
178

EMPLOYEE_ID DEPARTMENT_ID SALARY
----------- ------------- ----------
179 80 6200
180 50
181 50
182 50
183 50
184 50
185 50
186 50
187 50
188 50
189 50

EMPLOYEE_ID DEPARTMENT_ID SALARY
----------- ------------- ----------
190 50
191 50
192 50
193 50
194 50
195 50
196 50
197 50

107 rows selected.

本文转自MIKE老毕 51CTO博客,原文链接:http://blog.51cto.com/boylook/1298620,如需转载请自行联系原作者

利用Oracle VPD实现行级安全保护(二)相关推荐

  1. Oracle锁表 行级锁 表级锁 行级锁

    2019独角兽企业重金招聘Python工程师标准>>> Oracle锁表  行级锁  表级锁 ---- 行被排他锁定 ----在某行的锁被释放之前,其他用户不能修改此行       ...

  2. oracle行级的触发器,Oracle触发器Trigger2行级

    create table trigger_t2( id int, name varchar(30), age int ); /* --创建一个before update的触发器-控制每一行,行级 -- ...

  3. 一文搞懂Oracle 0 至 6 级锁(附案例详解)

    11g Concepts中摘录的锁的信息 Table Locks (TM) A table lock, also called a TM lock, is acquired by a transact ...

  4. java 3行4列二维数组_输入一个3行4列矩阵到二维数组中,并打印出来

    输入一个M行M列的二维数组,计算四周元素之和 设置数组S(M,M),M>1,ssum=s(1,1)+s(M,M)+s(1,M)+s(M,1)ifM>2fori=2toM-1ssum=ssu ...

  5. oracle 行级死锁_解决Oracle数据库死锁

    介绍 本文我们尝试总结在多个用户并发情况下,如何识别和解决删除操作期间发生的死锁问题,在开始之前,我们先简单描述一下什么是死锁以及什么东西会导致死锁. 死锁 在任何数据库中发生死锁都是不愉快的,即使是 ...

  6. 利用Oracle分析函数实现多行数据合并为一行

    demo场景,以oracle自带库中的表emp为例: select ename,deptno from emp order by deptno; ENAME DEPTNO CLARK 10 KING ...

  7. 应用ROWDEPENDENCIES行级跟踪,查询oracle表中数据行上最后的DML时间

    在Oracle 10g中的引入了ORA_ROWSCN伪列新特性.基于此种伪列所提供的信息,我们可以方便地找出某个数据块或某一个行最近被修改 的时间戳.它又分为两种模式:一种是基于block这是默认的模 ...

  8. oracle 行级死锁_ORACLE死锁的分类

    ORACLE里锁有以下几种模式: 0:none 1:null 空 2:Row-S 行共享(RS):共享表锁,sub share 3:Row-X 行独占(RX):用于行的修改,sub exclusive ...

  9. Oracle原理: 行级锁和表级锁

    行级锁就是施放在行上的排他锁,表级锁就是会施放在表上的排他锁.锁分为两大类:共享锁和排它锁.共享锁的意思就是可以其他用户来锁定表,而排它锁不准其他用户来锁定表. 锁具有:一致性(只允许一个用户修改数据 ...

最新文章

  1. 基于区块链交易技术开发的证券
  2. uniapp返回上一页_一例万级写入并发,百亿级数据,毫秒级返回架构分享
  3. grep的时候Binary file (standard input) matches 怎么解决?
  4. [SCOI2009]最长距离
  5. 运用python的方式_对Python使用mfcc的两种方式详解
  6. 学习ASP.NET Core Razor 编程系列三——创建数据表及创建项目基本页面
  7. 转行做调度,你准备好了吗
  8. PHP接口(interface)
  9. 链上合约(On-chain) 和 链下合约(Off-chain) 是什么 区别
  10. read()/write()的生命旅程之四——第四章:writeback
  11. linux下命令打开url,在linux命令下访问url
  12. gaussian 和gaussview_谈谈Gaussian软件中的guess=mix
  13. 小说网站系统源码|PHP付费小说网站源码带app
  14. 洛谷P1512伊甸园的日历游戏题解
  15. 计算机常用工具软件实训总结报告,计算机常用工具软件实训报告
  16. kafka-生产者消息发送流程
  17. typec耳机知识介绍
  18. java 1st 2nd 3rd 4th_为啥第一是1ST,第二是2ND,第三是3RD,第四开始都是TH呢1ST、2ND、...-3rd-英语-耿佬杜同学...
  19. Android证书生成(android studio)
  20. 60GHz通信标准简介

热门文章

  1. 返回一个一维整数数组中最大子数组的和02
  2. 由一次奇怪的编译出错想起的
  3. Crystal For Rubyists 简体中文
  4. 基于JWT(Json Web Token)的ASP.NET Web API授权方式
  5. 市民调取公共场所监控影像为何如此之难?
  6. 高逼格的画图:VIM原来可以这样玩
  7. PHP 一个可以过滤非法脚本的函数
  8. 95行代码实现最大熵模型训练
  9. 个人管理 - 目标管理之前,你会时间管理吗
  10. CCNP学习笔记(6)