Oraclehandbook系列之虚拟专用数据库VPD的使用详解.docVIP

  • 4
  • 0
  • 约5.27千字
  • 约 4页
  • 2017-08-22 发布于江苏
  • 举报

Oraclehandbook系列之虚拟专用数据库VPD的使用详解.doc

Oraclehandbook系列之虚拟专用数据库VPD的使用详解

VPD, HYPERLINK Oracle Virtual Private Database,即Oracle虚拟专用数据库,是指通过应用一些策略,使得用户只能访问被允许访问的那部分数据。其原理相对简单,Oracle根据策略自动为相应用户提交的语句添加Where句,从而控制用户可以访问和操作的数据。 首先我们准备演示用的几张表,并插入少量的测试数据: CREATETABLEvpdsample_clothing( ? clothing_idNUMBER, ? typeVARCHAR2(30), ? brandVARCHAR2(30), ? descriptonVARCHAR2(100) ? ); ? -- ? INSERTINTOvpdsample_clothingVALUES(10002,jacket,ABC,autumnstyle); ? INSERTINTOvpdsample_clothingVALUES(10003,t-shirt,XYZ,summerstyle); ? commit; ? CREATETABLEvpdsample_books( ? book_idNUMBER, ? nameVARCHAR2(30), ? authorVARCHAR2(20) ? ); ? -- ? INSERTINTOvpdsample_booksVALUES(10005,CountryDriving,PeterHessler); ? INSERTINTOvpdsample_booksVALUES(10006,Lifewithoutlimits,NickVujicic); ? commit;? (以上两个表模拟一个简单的库存情况,库中有两类物品,服装、图书。这里我们需要满足两个表中的ID的唯一性(可以通过sequence来实现)。) CREATETABLEvpdsample_users( ? user_nameVARCHAR2(20), ? user_privilegeNUMBER ? ); ? -- ? INSERTINTOvpdsample_usersVALUES(Jack,1); ? INSERTINTOvpdsample_usersVALUES(Rose,2); ? COMMIT;? (这个表存储用户的权限信息,其中的权限即后表vpdsample_privileges中的权限ID字段。) (这个表存储每个权限ID对应的权限信息,即对哪些对象(服装或图书)有权限。) 第二步,我们要创建一个context(实际上是【context名称空间】)。可以简单地把context理解为一个定义在内存中的容器,在此容器中我们可以定义若干个键值对,这些键值对可以在一定的范围内被共享(比如同一个session中,或者同一个Oracle实例中) 首先,使用system用户登录,赋予创建者相应的权限:grant create any context to user1;然后通过:CREATE OR REPLACE CONTEXT VPD USING pkg_vpdsample ACCESSED GLOBALLY;这里我们创建了一个叫’vpd’的context,’using’后面的是一个PLSQL package的名字,出于安全性考虑,Oracle需要你在创建context时指定一个包名,表示后续对些context的修改只能通过此包中的存储过程???行修改,不能通过dbms_session.set_context()直接进行修改。创建context时,package不存在并不会导致编译错误。 最后’accessed globally’是一个可选项,如果未添加此项,表示此context使用范围是某一session;如果指定了此项,则表示该context可以在整个数据库实例范围内共享。 欲删除context同样需要赋予相应的权限: grant?drop?any?context?to?user1; ? drop?context?VPD;? 第三步,建立一个package(即上面的pkg_vpdsample),包中的各个函数及存储过程的作用会随后逐一给出: CREATEORREPLACEPACKAGEpkg_vpdsample ? IS ? PROCEDUREenable_vpd; ? PROCEDUREdisable_vpd; ? PROCEDUREset_context(p_user_nameINVARCHAR2); ? FUNCTIONgen_vpd_predicate(p_column_nameINVARCHAR2)RETURNVARCHAR2; ? FUNCTIONapply_vpd_clothing(p1invarchar2,p2invarcha

文档评论(0)

1亿VIP精品文档

相关文档