打印本文 打印本文 关闭窗口 关闭窗口
ORACLE 的Virtual Private Database的全新体验
作者:武汉SEO闵涛  文章来源:敏韬网  点击数2204  更新时间:2009/4/22 22:08:18  文章录入:mintao  责任编辑:mintao
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      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

BOTT

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

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