打印本文 打印本文 关闭窗口 关闭窗口
ORACLE的VirtualPrivateDatabase的全新体验
作者:武汉SEO闵涛  文章来源:敏韬网  点击数2221  更新时间:2009/4/22 23:21:57  文章录入:mintao  责任编辑:mintao
为用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 8i提供了系统级的触发器,让我轻松地实现。

--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,重新登陆

Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production

With the Partitioning option

JServer Release 8.1.7.0.0 - 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操作的过滤策略。ORACLE8i提供了POLICY的概念,并且为此配备了一套系统程序包,来完成设置。下面,我来介绍一下:

connect secusr/secusr@oracle

--做一个函数,返回对应的过滤条件

create or replace package secusr.customer_security is

function customer_sec

return VARCHAR2;

end;

 

create or replace package body secusr.customer_security

is

function customer_sec(d1 varchar2,d2 varchar2)

return varchar2

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    &nb

上一页  [1] [2] [3]  下一页

打印本文 打印本文 关闭窗口 关闭窗口