知识大全 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相关参考
虚拟代理模式(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在方法中怎么用?和public有什么区别?请高手帮忙解答! 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,
知识大全 引用 造型 protected和private的困惑
或许大家java的多态问题对上溯下溯造型有了一定的概念对protected和private大家想必也很清楚但是这几个个结合在一起往往令人产生很多困惑在这里我举一个例子大家或许会发觉这篇文章对你来说
知识大全 php面向对象public private protected 访问修饰符
本篇文章是对php面向对象publicprivateprotected访问修饰符进行了详细的分析介绍需要的朋友参考下 PHP中有三种访问修饰符分别是public(公共的默认)protec
C++中是不允许virtual构造函数的如果在构造函数前加virtual 以vc为例编译器报错为inlineistheonlylegalstorageclassforconstructors
private关键字意味着除非那个特定的类而且从那个类的方法里否则没有人能访问那个成员同一个包内的其他成员不能访问private成员这使其显得似乎将类与我们自己都隔离起来另一方面也不能由几个合作的
在上例的成员函数声明中你需要注意两点getArea()定义为private型drawRect()定义为public型public型意味着任何类都可以调用它private型它只能被所声明的类内部调
oracle从备份的控制文件进行完全恢复 SYS@orcl#shutdownabort; ORACLE例程已经关闭 SYS@orcl# oracle@oracle:~/product//d