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] 下一页 [系统软件]EXP-00008: ORACLE error 904 encountered的解决方… [常用软件]PB7 连接 Oracle 的配置方法 [VB.NET程序]Public与Private的区别 [Web开发]oracle Export and Import 简介 [Web开发]ADO访问Oracle结果集的心得 [JAVA开发]JDBC+Hibernate将Blob数据写入Oracle [JAVA开发]J2EE应用中与Oracle数据库的连接 [JAVA开发]Oracle Application Serve_ [其他]HP-UXrx2600B.11.22Uia64安装oracle9i9.2foria64手… [其他]在RedhatEnterpriseserver3上安装oracle9iR2的注意…
|