[精]Oracle VPD详解(虚拟专用数据库)
所谓虚拟专用数据库(VPD)指的是,通过在数据库里进行配置,从而让不同的用户只能查看某 个表里的部分数据。VPD分为以下两个级别。
- 行级别:在该级别下,可以控制某些用户只能查看到某些数据行。比如,对于销售数据表sales 来说,每个销售人员只能检索出他自己的销售数据,不能查询其他销售人员的销售数据。
- 列级别:在该级别下,可以控制某些用户不能检索某个表的某个列的值。比如用户HR 下的 employees 表中,含有工资(salary)列,由于该列比较敏感,因此不让其他用户查询该列的值。 其他用户检索该列时,会发现其值全都为空(null )。
一、基于行的VPD
Select * from sales_list ;
Select * from sales_list where seller_id='S0020';
Select * from sales_list where values>1000 ;
Select * from sales_list where qty_sold>1000 and seller_id='S0020';
SQL> select sys_context('userenv','ip_address') "IP",
sys_context('userenv','db_name') "DB" from dual;
IP DB
--------------- ---------
152.68.32.60 ora10g
SQL> create or replace context sales_ctx using oe.sales_app_pkg;
SQL> drop context sales _ctx;
dbms_session.set_context ('context_name', 'attribute_name', 'attribute_value')
SQL> show user
USER is "SYS"
SQL> exec dbms_session.set_context('sales_ctx','seller_id','S0020');
BEGIN dbms_session.set_context('sales_ctx','seller_id','S0020'); END;
*
ERROR at line 1:
ORA-01031: insufficient privileges
ORA-06512: at "SYS.DBMS_SESSION", line 90
ORA-06512: at line 1
SQL> connect oe/oe
SQL> create or replace package sales_app_pkg is
2 procedure set_sales_context;
3 end;
4 /
SQL> create or replace package body sales_app_pkg is
2 procedure set_sales_context is
3 begin
4 dbms_session.set_context('sales_ctx','seller_id',user);
5 end;
6 end;
7 /
SQL> grant select on sales_list to public;
SQL> grant update on sales_list to public;
SQL> grant execute on sales_app_pkg to public;
SQL> connect hr/hr
SQL> exec oe.sales_app_pkg.set_sales_context;
SQL> select sys_context('sales_ctx','seller_id') from dual;
SYS_CONTEXT('SALES_CTX','SELLER_ID')
--------------------------------------------------------------------------------
HR
SQL> create or replace package sales_app_pkg is
2 procedure set_sales_context;
3 function where_condition
4 (p_schema_name varchar2,p_tab_name varchar2)
5 return varchar2;
6 end;
7 /
SQL> create or replace package body sales_app_pkg is
2 procedure set_sales_context is
3 v_user varchar2(30);
4 begin
5 dbms_session.set_context('sales_ctx','seller_id',user);
6 end;
7
8 function where_condition
9 (p_schema_name varchar2,p_tab_name varchar2) return varchar2 is
10 v_seller_id varchar2(100) := upper(sys_context('sales_ctx','seller_id'));
11 v_where_condition varchar2(2000);
12 begin
13 if v_seller_id like 'S%' then
14 v_where_condition := 'seller_id = ' || '''' || v_seller_id || '''';
15 else
16 v_where_condition := null;
17 end if;
18 return v_where_condition;
19 end;
20 end;
21 /
SQL> connect / as sysdba
SQL> begin
2 dbms_rls.add_policy(
3 OBJECT_SCHEMA=>'oe',
4 OBJECT_NAME=>'sales_list',
5 POLICY_NAME=>'oe_sales_list_fgac',
6 FUNCTION_SCHEMA=>'oe',
7 POLICY_FUNCTION=>'sales_app_pkg.where_condition',
8 STATEMENT_TYPES=>'select,update',
9 UPDATE_CHECK=>true,
10 ENABLE=>true);
11 end;
12 /
SQL> connect / as sysdba
SQL> create or replace trigger set_seller_id_on_logon
2 after logon on DATABASE
3 begin
4 oe.sales_app_pkg.set_sales_context;
5 end;
6 /
SQL> connect oe/oe
SQL> select seller_id,count(*) from sales_list group by seller_id;
SELLER_ID COUNT(*)
--------- ---------
S0010 1067
S0030 968
S0020 1465
SQL> connect s0010/s0010
SQL> select sys_context('sales_ctx','seller_id') from dual;
SYS_CONTEXT('SALES_CTX','SELLER_ID')
---------------------------------------
S0010
SQL> select seller_id,count(*) from oe.sales_list group by seller_id;
SELLER_ID COUNT(*)
--------- ---------
S0010 1067
SQL> select seller_id,qty_sold from oe.sales_list where id=300;
SELLER_ID QTY_SOLD
--------- --------
S0010 1
SQL> update oe.sales_list set seller_id='S0020' where id=300;
update oe.sales_list set seller_id='S0020' where id=300
*
ERROR at line 1:
ORA-28115: policy with check option violation
SQL> begin
2 dbms_rls.drop_policy(
3 OBJECT_SCHEMA=>'oe',
4 OBJECT_NAME=>'sales_list',
5 POLICY_NAME=>'oe_sales_list_fgac');
6 end;
7 /
二、基于列的VPD
SQL> connect hr/hr
SQL> create or replace function hr_col_vpd
2 (p_owner in varchar2,p_obj in varchar2)
3 return varchar2
4 is
5 l_ret varchar2(2000);
6 begin
7 if (p_owner = USER) then
8 l_ret := NULL;
9 else
10 l_ret := '1=2';
11 end if;
12 return l_ret;
13 end;
14 /
SQL> begin
2 dbms_rls.add_policy(object_schema=>'hr',
3 object_name=>'employees',
4 policy_name=>'hr_emp_col_policy',
5 function_schema=>'hr',
6 policy_function=>'hr_col_vpd',
7 statement_types=>'select',
8 sec_relevant_cols=>'salary',
9 sec_relevant_cols_opt => dbms_rls.all_rows
10 );
11 end;
12 /
SQL> connect hr/hr
SQL> select employee_id,last_name,salary from hr.employees where rownum<4;
EMPLOYEE_ID LAST_NAME SALARY
----------- ------------- -------
198 OConnell 2600
199 Grant 2600
200 Whalen 4400
SQL> connect oe/oe
SQL> select employee_id,last_name,salary from hr.employees where rownum<4;
EMPLOYEE_ID LAST_NAME SALARY
----------- ------------- -------
198 OConnell
199 Grant
200 Whalen
[精]Oracle VPD详解(虚拟专用数据库)相关推荐
- Oracle分区详解和创建,数据库优化-Oracle表分区的创建和分类
Oracle的表分区功能通过改善可管理性.性能和可用性,从而为各式应用程序带来了极大的好处.通常,分区可以使某些查询以及维护操 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降, ...
- oracle数据库中的虚拟表,Oracle10g中的虚拟专用数据库(VPD)
什么是VPD 所谓虚拟专用数据库(VPD)指的是,通过在数据库里进行配置,从而让不同的用户只能查看某个表里的部分数据.VPD分为以下两个级别: 行级别:在该级别下,可以控制某些用户只能查看到某些行数据 ...
- oracle scn 重置,学习笔记:Oracle SCN详解 SCN与Oracle数据库恢复的关系
天萃荷净 分享一篇关于Oracle SCN的详解,介绍SCN与Oracle数据库恢复的关系和SCN在数据库中的作用 一.为什么需要System checkpoint SCN号与Datafile Che ...
- Oracle 错误代码详解
Oracle 错误代码详解及解决方式–ORA ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常. ORA-00017: 请求会话以设置跟踪事 ...
- Oracle 数据字典详解
Oracle 数据字典详解 什么叫数据字典? 数据字典指的是描述数据的数据. 举个例子:我们在数据库里面创建了一个表,这个表位于哪个数据文件.这个表有哪些列.这个表的每一个列的数据类型.这个表的约束等 ...
- Oracle ASM 详解 收藏
Oracle ASM 详解 ASM:Automatic Storage Management, 是Oracle 主推的一种面向Oracle的存储解决方案, ASM 和 RDBMS 非常相似,ASM 也 ...
- oracle有哪两种内存结构,Oracle体系结构详解(物理构造,内存结构和逻辑结构)...
当前位置:我的异常网» 数据库 » Oracle体系结构详解(物理构造,内存结构和逻辑结构 Oracle体系结构详解(物理构造,内存结构和逻辑结构) www.myexceptions.net 网友分 ...
- Oracle 冷备份详解【实战案例】
Oracle 冷备份详解 --准备工作 select * from v$database; select file_name from dba_data_files; create tablespac ...
- oracle里面asm的作用,Oracle ASM 详解
Oracle ASM 详解 ASM:Automatic Storage Management, 是Oracle 主推的一种面向Oracle的存储解决方案, ASM 和 RDBMS 非常相似,ASM 也 ...
最新文章
- java学习规划-转的
- 【数理知识】co-inner-outer factorizations
- ST-Link VCP Ctrl驱动安装失败解决(win7 64bits)
- loadrunner编写脚本常用策略,用以记录,看的懂的拿走,看不懂说明与你有缘无份...
- 【Win10】UAP/UWP/通用 开发之 x:Bind
- linux mysql 卸载,安装,测试全过程
- android-gradle-plugin3.0.1源码分析
- 遍历查询+从非根节点开始遍历+从下向上遍历树+从层次化查询中删除节点和分支...
- funCode课程实训(C++ )
- 服务器网站兼容不正常,升级为IE11后兼容模式设置,部分网站无法正常浏览,兼容模式仍然无法正常访问部分网站的解决办法...
- 概率论总结——泊松分布与指数分布
- Oracle全局索引和本地索引
- 视觉十四讲:第九讲_BA优化_g2o
- 移动端vue+vant+高德地图实现拖拽选址,周边选址,搜索选址,自动定位,选择城市功能,获取地址经纬度,详细地址
- 任意函数展开为各阶Taylor多项式的matlab程序
- 多个txt文件合并成一个文本
- 淘宝API 获取购买到的商品订单详情
- UHD-SDI GT v2.0(PG380)
- python做乘法运算定律_四年级乘法运算定律-
- 第2章 Maven的安装与配置
热门文章
- IPC机制(三)--->Android中的几种IPC方式
- 信息学奥赛一本通的一些问题
- 外贸企业邮箱开通入口,企业邮箱开通全流程攻略
- 安装lamp服务器系统,LAMP安装环境搭建详解
- 【银行笔试题】技术+业务,综合题类
- 注重发展创客教育的队伍建设
- 近万字带你了解“c++“STL中的各种容器
- FITC Phalloidin|FITC标记鬼笔环肽,915026-99-2
- 秦川精密工业机器人减速器装配线_中国工业机器人关节减速生产线秦川造
- C++ 计算直线的交点数(动态规划)