Oracle虚拟私有数据库(Virtual Private Database,下文简称VPD)是Oracle数据库产品中提供的一个安全功能,它能够保证Oracle数据库的多租户特性,与此同时,可以帮助用户进行数据库的整合。

  Oracle VPD能够针对数据库表和视图,在行与列级别对数据访问进行控制。从名称来看,Oracle VPD表达的意思多少有些误导的嫌疑,毕竟Oracle数据库已经是一个多用户的数据库,每个用户也许没有意识到他们正在共享数据库。因此,将Oracle VPD称为虚拟私有模式对象(Virtual Private Schema Object,VPSO)更为贴切,因为它会在数据库内将表、视图以及同义词进行虚拟化。但是在本文中,我们还是现将其称为VPD。

  鉴于Oracle的用户/角色安全权限模型允许访问模式对象,因此VPD将通过访问策略来强制对模式对象数据的细粒度访问。当访问策略开始执行,VPD将会动态地调整SQL语句,如SELECT、UPDATE和INSERT,其方式就是加一个WHERE条件来过滤结果。VPD不仅对用户是透明的,而且它的安全性是无法被忽视的。在Oracle企业版数据库产品中,VPD选项还是免费提供的。

  在下文要提到的VPD用例中,将介绍它如何在同一个模式下存储多个公司的数据。

  使用Oracle VPD

  在许多初创的公司中,口香糖生产公司ABC看到了商机,希望能够借助托管的业务系统来迅速占领市场。他们决定建立一个客户信息系统(CIS)作为集中的网络托管与数据服务应用。为了让这个基于云的SaaS交付模型能够取得成功,他们必须整理一套解决方案,能够不修改现有的应用代码,并提供数据安全性保障,并快速地进行测试,将投资回报率最大化。

  公司的IT团队否定了为每个客户端部署单独的数据库策略,因为这样做无法满足所有的需求。因此他们开始考虑共享一个单独的数据库,其中数据库负责人建议在同一个数据库模式下用Oracle VPD存储多客户数据。他解释了VPD对于应用是完全透明的,能够提供行级数据安全,满足销售团队的灵活性需求,它是最划算的部署策略。他解释了客户为何无法认识到他们在共享一个模式对象。

  此外,他还描述了设计的主要组件是如何部署的(表1)。首先,用户将继续使用特定客户端连接池作为一个代理,通过现有的Web应用来连接到数据库。当数据库会话建立之后,一个应用语境将被设置来高效地捕获客户端标识符属性。安全性访问策略将基于一个策略函数,它将应用到模式对象中以强制客户端数据的逻辑分离。策略函数将使用应用语境和一个客户端标识列来返回一个条件限制行,访问CIS的表、视图以及同义词。

  表1:ABC的VPD设置

  --以数据库VPD管理员身份登录

  --创建一个应用语境持有客户端标识符

  create context client_ctx using client_ctx_pkg;

  context CLIENT_CTX created.

  --创建一个PL/SQL包对应用语境进行设置

  create or replace package client_ctx_pkg is procedure set_client_id; end;

  /

  create or replace package body client_ctx_pkg is procedure set_client_id as client_id number;

  begin

  select client_id into client_id

  from CIS.client where client_name = sys_context('userenv', 'session_user');

  dbms_session.set_context('client_ctx', 'client_id', client_id);

  exception

  when no_data_found then null;

  end;

  end;

  /

  PACKAGE client_ctx_pkg compiled

  PACKAGE BODY client_ctx_pkg compiled

  --创建一个登录触发器以运行应用语境PL/SQL包

  create trigger set_client_id_ctx_trg after logon on database

  begin

  client_ctx_pkg.set_client_id;

  end;

  /

  TRIGGER set_client_id_ctx_trg compiled

  --创建一个PL/SQL策略函数来限制数据访问

  create or replace function filter_client_data( schema_p in varchar2, table_p in varchar2)

  return varchar2

  as client_predicate varchar2 (100);

  begin

  client_predicate := 'client_id = sys_context(''client_ctx'', ''client_id'')';

  return client_predicate;

  end;

  /

  FUNCTION filter_client_data compiled

  --基于策略函数创建一个安全性策略并应用到客户表

  begin

  dbms_rls.add_policy (object_schema => 'cis'

  ,object_name => 'customer'

  ,policy_name => 'client_policy'

  ,function_schema => 'vpd_admin'

  ,policy_function => 'filter_client_data'

  );

  end;

  /

  anonymous block completed
设置好了,VPD现在可以动态地添加条件到每一个查询,并高效地过滤每一个客户端的数据(表2)。

  表2:ABC运行VPD

  --1.作为一个Big Bubble Company用户,选择你的客户

  select customer_name from CIS.customer;

  CUSTOMER_NAME

  ------------------------------

  The Gum Shop

  Jaime’s Candy

  Shannon’s Pharmacy

  -- 2. 作为一个Chew IT Enterprises 用户,选择你的客户

  select customer_name from CIS.customer;

  CUSTOMER_NAME

  ------------------------------

  Sweet Tooth

  Gum Emporium

  --确认VPD动态添加一个条件到每个查询

  explain plan

  set statement_ID = 'XXX'

  for select * from CIS.customer;

  select * from table(dbms_xplan.display('PLAN_TABLE','XXX','TYPICAL'));

  ------------------------------------------------------------------------------

  | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

  ------------------------------------------------------------------------------

  | 0 | SELECT STATEMENT | | 2 | 60 | 3 (0)| 00:00:01 |

  |* 1 | TABLE ACCESS FULL| CUSTOMER | 2 | 60 | 3 (0)| 00:00:01 |

  ------------------------------------------------------------------------------

  Predicate Information (identified by operation id):

  ---------------------------------------------------

  1 - filter("CLIENT_ID"=TO_NUMBER(SYS_CONTEXT('client_ctx','client_id')))

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

利用Oracle虚拟私有数据库进行整合相关推荐

  1. oracle实例名,数据库名,服务名等概念差别与联系

    数据库名.实例名.数据库域名.全局数据库名.服务名 这是几个令非常多刚開始学习的人easy混淆的概念.相信非常多刚開始学习的人都与我一样被标题上这些个概念搞得一头雾水.我们如今就来把它们弄个明确. 一 ...

  2. oracle 查虚拟路径,Oracle 11g RMAN虚拟私有目录

    虚拟私有目录 缺省情况下,RMAN恢复目录的所有用户都有完全的权限来向恢复目录插入,更新与删除元数据.例如,如果管理员管理的两个不相关的数据库共享同一个恢复目录,每个管理员都可以有意或无意的损坏另一个 ...

  3. [精]Oracle VPD详解(虚拟专用数据库)

    所谓虚拟专用数据库(VPD)指的是,通过在数据库里进行配置,从而让不同的用户只能查看某 个表里的部分数据.VPD分为以下两个级别. 行级别:在该级别下,可以控制某些用户只能查看到某些数据行.比如,对于 ...

  4. oracle数据库中的虚拟表,Oracle10g中的虚拟专用数据库(VPD)

    什么是VPD 所谓虚拟专用数据库(VPD)指的是,通过在数据库里进行配置,从而让不同的用户只能查看某个表里的部分数据.VPD分为以下两个级别: 行级别:在该级别下,可以控制某些用户只能查看到某些行数据 ...

  5. javaweb分页查询oracle,JavaWeb项目 利用Oracle数据库实现分页查看细讲

    一.了解数据库指令 Oracle数据库相对于MySQL数据库来说,要实现分页查看,Oracle中没有像MySQL里的limit命令,使用的Oracle语句也比较复杂 select * from (se ...

  6. DOTNET零碎要点---1.vb.net利用Oracle.DataAccess.dll链接Oracle数据库

    1.vb.net利用Oracle.DataAccess.dll链接Oracle数据库 DOTNET学习笔记---1.vb.net利用Oracle.DataAccess.dll链接Oracle数据库 2 ...

  7. navicat查询oracle表结构,利用Navicat Premium导出数据库表结构信息至Excel的方法

    因为要编写设计文档,需要用到数据库表结构,想要在word文档中以二维表格的形式展示,故借助Excel形成二维表格样式,还是很方便的样子! 1.新建查询,并将以下SQL语句修改至需要 SELECT CO ...

  8. 利用Java存储过程简化数据库操作

       利用Java存储过程沟通SQL.XML.Java.J2EE和Web服务. 存储过程(stored procedure)允许将运行于数据库层中的持久性逻辑与运行于中间层中的商务逻辑有效地分离开来. ...

  9. (ORACLE)PL/SQL 数据库概念

    (ORACLE)PL/SQL 数据库的概念 数据库的概念 数据库就是存放数据的仓库,是按照数据的结构来组织,管理,存储的仓库,是对数据持久化的工具,数据库(本质就是一个软件),它能有效的管理数据,数据 ...

最新文章

  1. stc15w404as引脚图_STC15F2K6S2与stc15w404AS的spi通讯
  2. vue-cli安装、node-sass安装、mintUI组件库安装
  3. 使Element默认字体为中文
  4. 《领域特定语言》一1.5使用代码生成
  5. nubia android root权限,获取中兴NX403a (Nubia Z5S Mini Android 4.2)ROOT权限教程,新手必看...
  6. FTD概要图之MVC架构
  7. 事业编前提下,在一个大单位工作好还是在一个小单位工作好?
  8. script setup 影响methods选项导出函数
  9. python循环的基本思想是重复_python基础-循环
  10. 计算机网络 Kurose 第二章 应用层 2.5 P2P文件分发 2.6 视频流和内容分发网
  11. C#、ASP.NET 将PDF转换成Swf
  12. 英语口语175之每日十句口语
  13. 苹果手机怎么把计算机放到桌面,苹果怎么投影到电脑_怎么把苹果手机投影到电脑屏幕上-win7之家...
  14. [Win32]鼠标的基本概念以及击中测试
  15. 【JD的一人戏】之小羊踢足球第一篇
  16. adobe cs5 indesign 不显示文本框_Adobe CS5 InDesign自动添加页码
  17. BugKu-图穷匕见
  18. 自动化测试难题,验证码如何解决
  19. 金山打字通语句练习的文本
  20. iot 开源平台thingsboard使用总结

热门文章

  1. html文件上传数量限制,使用HTML中的input上传文件最多可以上传多少张?
  2. 速冻果蔬青麦源品牌-农业大健康·李喜贵:谋定功能性技术
  3. node 创建静态web服务器(下)(处理异步获取数据的两种方式)
  4. Python:名片管理系统
  5. C/C++获取系统当前时间
  6. Jumping Jack
  7. uboot nand erase 的显示错误修复
  8. JS级别联动下拉列表
  9. 从frame跳转到一个新的页面
  10. 企业客户都满意的ToB产品运营秘诀