使用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的操作;