使用VPD对数据进行隔离

2012-06-28(Thursday) 00:00

项目需求:系统数据表删除操作是直接物理删除,不利于维护历史记录,需要变更为逻辑删除模式。

解决方案:

对表增加删除标记字段DEL_FLAG varchar2(1) default ‘0’;

用户执行“删除”操作时,并不执行物理删除操作,而是将DEL_FLAG值设置为‘1’;

针对数据展示时,删除标记为’1’的数据使用VPD技术屏蔽访问;

1.需要修改的基表[T]新增删除字段:

alter table T add (DEL_FLAG varchar2(1) default '0');--缺省为0,逻辑删除改为1

2.创建VPD需要的函数:f_limited_query_t

CREATE OR REPLACE FUNCTION f_limited_query_t (s_schema IN VARCHAR2,

s_object IN VARCHAR2)

RETURN VARCHAR2

AS

BEGIN

RETURN 'DEL_FLAG!='''||'1'||'''';

END;

3.创建策略:POLICY_LIMITED_QUERY_T

BEGIN DBMS_RLS.add_policy (object_schema   => 'APPS',
object_name     => 'T',
policy_name     => 'POLICY_LIMITED_QUERY_T',
function_schema => 'APPS',
policy_function => 'F_LIMITED_QUERY_T'); END;

取消策略:(不用过滤时使用此命令)

BEGIN DBMS_RLS.drop_policy (object_schema   => 'APPS',
object_name     => 'T',
policy_name     => 'POLICY_LIMITED_QUERY_T'); END;

 

4.修改FORM中对相关数据表的删除逻辑为更新DEL_FLAG=1的操作;

Category: oracle Tagged: VPD