利用Oracle虚拟私有数据库进行整合

简介:

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,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
Oracle 关系型数据库 Linux
【赵渝强老师】Oracle数据库配置助手:DBCA
Oracle数据库配置助手(DBCA)是用于创建和配置Oracle数据库的工具,支持图形界面和静默执行模式。本文介绍了使用DBCA在Linux环境下创建数据库的完整步骤,包括选择数据库操作类型、配置存储与网络选项、设置管理密码等,并提供了界面截图与视频讲解,帮助用户快速掌握数据库创建流程。
337 93
|
1月前
|
Oracle 关系型数据库 Linux
【赵渝强老师】使用NetManager创建Oracle数据库的监听器
Oracle NetManager是数据库网络配置工具,用于创建监听器、配置服务命名与网络连接,支持多数据库共享监听,确保客户端与服务器通信顺畅。
176 0
|
4月前
|
存储 Oracle 关系型数据库
服务器数据恢复—光纤存储上oracle数据库数据恢复案例
一台光纤服务器存储上有16块FC硬盘,上层部署了Oracle数据库。服务器存储前面板2个硬盘指示灯显示异常,存储映射到linux操作系统上的卷挂载不上,业务中断。 通过storage manager查看存储状态,发现逻辑卷状态失败。再查看物理磁盘状态,发现其中一块盘报告“警告”,硬盘指示灯显示异常的2块盘报告“失败”。 将当前存储的完整日志状态备份下来,解析备份出来的存储日志并获得了关于逻辑卷结构的部分信息。
|
2月前
|
SQL Oracle 关系型数据库
Oracle数据库创建表空间和索引的SQL语法示例
以上SQL语法提供了一种标准方式去组织Oracle数据库内部结构,并且通过合理使用可以显著改善查询速度及整体性能。需要注意,在实际应用过程当中应该根据具体业务需求、系统资源状况以及预期目标去合理规划并调整参数设置以达到最佳效果。
275 8
|
4月前
|
SQL Oracle 关系型数据库
比较MySQL和Oracle数据库系统,特别是在进行分页查询的方法上的不同
两者的性能差异将取决于数据量大小、索引优化、查询设计以及具体版本的数据库服务器。考虑硬件资源、数据库设计和具体需求对于实现优化的分页查询至关重要。开发者和数据库管理员需要根据自身使用的具体数据库系统版本和环境,选择最合适的分页机制,并进行必要的性能调优来满足应用需求。
238 11
|
4月前
|
Oracle 关系型数据库 数据库
数据库数据恢复—服务器异常断电导致Oracle数据库报错的数据恢复案例
Oracle数据库故障: 某公司一台服务器上部署Oracle数据库。服务器意外断电导致数据库报错,报错内容为“system01.dbf需要更多的恢复来保持一致性”。该Oracle数据库没有备份,仅有一些断断续续的归档日志。 Oracle数据库恢复流程: 1、检测数据库故障情况; 2、尝试挂起并修复数据库; 3、解析数据库文件; 4、导出并验证恢复的数据库文件。
|
4月前
|
存储 Oracle 关系型数据库
【赵渝强老师】Oracle RMAN的目录数据库
Oracle RMAN默认将备份元信息存储在控制文件中,但控制文件损坏或丢失会导致恢复失败,且备份增多会使控制文件无限增长。为解决这些问题,Oracle引入了RMAN目录数据库(Catalog Database),专门用于存储RMAN备份的元信息。使用目录数据库可提升备份管理效率,支持多数据库共享、长期备份历史记录存储,并可保存RMAN脚本。本文详细介绍了如何创建目录数据库、注册目标数据库及其操作步骤。
123 0
|
7月前
|
Oracle 安全 关系型数据库
【Oracle】使用Navicat Premium连接Oracle数据库两种方法
以上就是两种使用Navicat Premium连接Oracle数据库的方法介绍,希望对你有所帮助!
1501 28
|
5月前
|
存储 Oracle 关系型数据库
oracle数据恢复—oracle数据库执行错误truncate命令的数据恢复案例
oracle数据库误执行truncate命令导致数据丢失是一种常见情况。通常情况下,oracle数据库误操作删除数据只需要通过备份恢复数据即可。也会碰到一些特殊情况,例如数据库备份无法使用或者还原报错等。下面和大家分享一例oracle数据库误执行truncate命令导致数据丢失的数据库数据恢复过程。

热门文章

最新文章

推荐镜像

更多