知识大全 ORACLE Virtual Private Database 全新体验

Posted 系统

篇首语:生当作人杰,死亦为鬼雄。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 ORACLE Virtual Private Database 全新体验相关的知识,希望对你有一定的参考价值。

ORACLE Virtual Private Database 全新体验  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  在开始对ORACLE的Virtual Private Database的介绍之前 笔者想就ROW RULE control(行记录级访问控制)的概念简单地说几句      行记录级访问控制问题的提出和意义?  企业的应用系统都离不开数据库系统 数据库系统的权限控制是很重要的一个环节 大型数据库系统(ORACLE DB SYBASE MS SQLSERVER)都提供完善的用户管理机制 从而可以严密地控制数据库对象(表 视图 函数 存储过程 程序包等等)的访问 但是 这往往是对象级别的     随着商务需求地不断地提出 出现了对于行记录控制的要求:     ) 数据查询和报表输出数据需要能够进行有效地隔离 如在一个简单地销售数据统计应用中 大区经理 地区经理和销售员查询的数据就不同      ) ASP(应用服务供应商)系统出现 在系统结构上 就出现了许多企业用户的数据都会存放在同一个数据库种 但是系统需要能够有效地隔离     为了满足这样的需求 在业务数据表需要中加上一些字段来进行控制 应用的开发往往会另行开发很多代码来实现行记录控制 但是 随着业务的变化 我们会发现开发和维护这种管理需求的成本越来越高     我们需要寻找一种新的解决方案 能够使应用系统的架构设计简单 扩展性强 管理和维护的成本很低     ORACLE i的一个新特性Virtual Private Database    ORACLE i提供了一个新的特性 来实现行级规则的控制 称之为Virtual Private Database 充分利用 i提供的Virtual Private Database技术 可以实现 一个数据库Schema的数据同时给多个数据库用户访问 但是又能很好地隔离各自的数据内容 显然 这已经不是原来的对象级的控制的概念     下面是笔者的体验 写下来 供大家参考 我先通过一个简单的例子 来说明ORACLE i的这个新特性(需ORACLE i的企业版才支持)     环境:Windows Server + ORACLE (Enterprise Edition)    在SCOTT用户下 有一个Customers表 记录著客户资料 以后为每个客户分配一个ORACLE数据库登陆账号 客户可以登陆 查询自己的订单情况 那么 我们需要做的就是能够把每个登陆账号和客户代码对应起来 就是说要实现一个映射关系 当然 通过自己建关系映射表 写代码做 也可以实现 但是ORACLE I把这一切变地非常简单(我接下来的介绍都会围绕着ORACLE i这项技术是我们的工作如何更加简单 如何更加容易控制 请记住 这是笔者写这篇文章的目的)      建立一个SECUSR的账号 用于权限控制用    connect system/manager@oracle;    create user secusr identified by secusr;    grant connect resource dba to secusr;     把Customers的查询权利赋予secusr    connect scott/tiger@oracle;    grant select on Customers to secusr;     连接到secusr用户    connect secusr/secusr@oracle;     创建上下文    create context Customer_context USING secusr CUSTOMER_SECURITY_CONTEXT;     创建程序包customer_security_context    create or replace package    secusr customer_security_context is    procedure set_customerid;    end;    create or replace package body    secusr Customer_security_context is    procedure set_customerid is    begin    IF SYS_CONTEXT( USERENV SESSION_USER )= SCOTT THEN      DBMS_SESSION SET_CONTEXT( customer_context customerid ALFKI );    END IF;    end;    end;     授权    grant execute on secusr Customer_security_context to public;     ORACLE i中提供了Context(连接上下文)的概念 类似于asp中的session 你可以为当前这个连接设置多个全局变量 记录信息 这个信息一直保持到连接被释放 上面的代码 就是为用SCOTT账号登陆的连接 进行了一次客户代码的映射(SCOTT >ALFKI) 而且 随时可以SYS_CONTEXT来查询     具体代码如下     SQL> connect scott/tiger@oracle;    已连接     SQL> execute secusr Customer_security_context set_customerid;    PL/SQL 过程已成功完成     SQL> select SYS_CONTEXT( CUSTOMER_CONTEXT CUSTOMERID ) FROM DUAL;    SYS_CONTEXT( CUSTOMER_CONTEXT CUSTOMERID )         ALFKI     但是 我觉的还不够 能够做到每个连接建立的时候 就自动完成这种映射 令人高兴的是 ORACLE i提供了系统级的触发器 让我轻松地实现      SCOTT用户登陆触发器    connect system/manager@oracle    CREATE OR REPLACE TRIGGER scott tg_set_usr_context    AFTER LOGON ON DATABASE    BEGIN    secusr customer_security_context set_customerid;    END;     断掉connection 重新登陆    Oracle i Enterprise Edition Release Production    With the Partitioning option    JServer Release Production    SQL> CONNECT scott/tiger@oracle    已连接     SQL> select SYS_CONTEXT( CUSTOMER_CONTEXT CUSTOMERID ) FROM DUAL;    SYS_CONTEXT( CUSTOMER_CONTEXT CUSTOMERID )         ALFKI    SQL>     好了 够简单吧     采用Virtual Private Database如何达到SQL DML上的数据控制访问要求呢?    Virtual Private Database技术可以对一张表的记录设置DML操作的过滤策略 ORACLE i提供了POLICY的概念 并且为此配备了一套系统程序包 来完成设置 下面 我来介绍一下     connect secusr/secusr@oracle     做一个函数 返回对应的过滤条件    create or replace package secusr customer_security is    function customer_sec    return VARCHAR ;    end;    create or replace package body secusr customer_security    is    function customer_sec(d varchar d varchar )    return varchar     IS    begin    IF SYS_CONTEXT( USERENV SESSION_USER ) IN ( SYS SYSTEM SECUSR ) THEN      RETURN NULL;    ELSE      RETURN customerid= || SYS_CONTEXT( CUSTOMER_CONTEXT CUSTOMERID ) || ;    END IF;    end;    end;     设置表数据的分割过滤    EXECUTE DBMS_RLS ADD_POLICY( SCOTT Customers Customers_sec_Policy      SECUSR      customer_security customer_sec      SELECT UPDATE DELETE );     customer_security程序包的customer_sec函数实现了 根据但前的CONTEXT中CUSTOMERID的内容 来返回一个过滤的策略 函数的参数形式是固定的 通过dbms_rls程序包的ADD_POLICY过程 把策略条件同表绑定以来 以后 每次select update delete都会自动应用这个策略     好了 现在我们来测试一下     用SCOTT登陆 只能看到自己的信息    SQL> connect scott/tiger@oracle;    已连接     SQL> select customerid city from Customers ;    CUSTOMERID CITY         ALFKI   Berlin     用SYSTEM登陆 可以看到所有的    SQL> connect system/manager@oracle;    已连接     SQL> select customerid city from SCOTT Customers ;    CUSTOMERID CITY         ALFKI   Berlin    ANATR   México D F     ANTON   México D F     AROUT   London    BERGS   Lule?  D F     BLAUS   Mannheim    BLONP   Strasbourg    BOLID   Madrid    BONAP   Marseille    BOTTM   Tsawassen    BSBEV   London     非常好 完全满足了要求 现在可以放心地把SCOTT账号给客户(ALFKI)了 客户可以查询自己的订单情况 当然只能是自己的     SQL> SELECT a orderid a customerid a orderdate        sum(c UnitPrice*c Quantity*( c Discount)) as TotalMoney        FROM Orders a Customers b Order Details c   cha138/Article/program/Oracle/201311/18040

相关参考

知识大全 虚拟代理模式(Virtual Proxy)(图)

虚拟代理模式(VirtualProxy)(图)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  虚

知识大全 sealed、new、virtual、abstract 和 override

   一sealed 密封类不能被继承密封方法可以重写基类中的方法但本身不能在任何子类中进行重写     &n

知识大全 c#中private私有和public公有的区别是什么

c#中private私有和public公有的区别是什么private、protect、public、访问范围依次增大。private只限在本类中使用。protect允许它的子类访问。public修饰符

知识大全 C#中private 在方法中怎么用

C#中private在方法中怎么用?和public有什么区别?请高手帮忙解答!  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,

知识大全 引用 造型 protected和private的困惑

  或许大家java的多态问题对上溯下溯造型有了一定的概念对protected和private大家想必也很清楚但是这几个个结合在一起往往令人产生很多困惑在这里我举一个例子大家或许会发觉这篇文章对你来说

知识大全 php面向对象public private protected 访问修饰符

本篇文章是对php面向对象publicprivateprotected访问修饰符进行了详细的分析介绍需要的朋友参考下   PHP中有三种访问修饰符分别是public(公共的默认)protec

知识大全 privte的析构函数和构造函数

  C++中是不允许virtual构造函数的如果在构造函数前加virtual  以vc为例编译器报错为inlineistheonlylegalstorageclassforconstructors  

知识大全 不能接触

  private关键字意味着除非那个特定的类而且从那个类的方法里否则没有人能访问那个成员同一个包内的其他成员不能访问private成员这使其显得似乎将类与我们自己都隔离起来另一方面也不能由几个合作的

知识大全 不同类型的成员函数

   在上例的成员函数声明中你需要注意两点getArea()定义为private型drawRect()定义为public型public型意味着任何类都可以调用它private型它只能被所声明的类内部调

知识大全 oracle从备份的控制文件进行完全恢复

  oracle从备份的控制文件进行完全恢复  SYS@orcl#shutdownabort;  ORACLE例程已经关闭  SYS@orcl#  oracle@oracle:~/product//d