业务是这样:
触发过来的记录有以下一些判断约束:
新增:无约束,新增一条数据变动。
修改:
1) 如果变动表中存在同一记录的新增变动记录,但该新增变动记录处理状态为未处理,如果过滤状态为未过滤,则更新该新增变动记录的接受时间为当前时间;如果过滤状态为已过滤,则不做任何处理。
2) 如果变动表中存在同一记录的修改变动记录,但该修改变动记录处理状态为未处理,则更新该修改变动记录(更新接收时间为当前时间),并设置该修改变动记录的过滤状态为未过滤。
3) 其他情况,添加一条修改的变动记录。
删除:
1) 如果变动表中存在同一记录的新增变动记录,但该新增变动记录处理状态为未处理,则删除该新增变动记录。
2) 如果变动表中存在同一记录的修改变动记录,但该修改变动记录处理状态为未处理,则删除该修改变动记录,并添加一条删除的变动记录(或者更新该修改变动记录为删除变动记录,接受时间为当前时间,过滤状态为未过滤)。
3) 其他情况,添加一条删除的变动记录。
触发器的代码为:
create or replace trigger wcmdocument_IDCS
after insert or delete or update on wcmdocument
for each row
declare
cursor cur_temp is select * from IDCSSite.IDCS_PortalContent ic where ic.docid=:new.DOCID;
begin
if inserting then
insert into IDCSSite.IDCS_PortalContent(guid,docid,doctitle,modifystate,modifydate,inputstate,hidestate)
values(sys_guid(),:new.DOCID,:new.DOCTITLE,1,sysdate,0,0);
elsif deleting then
open cur_temp;
if cur_temp%found then
FOR t_field in cur_temp LOOP
if t_field.MODIFYSTATE =1 and t_field.DEALUSERACCOUNT is null then--新增记录 未处理
delete IDCSSite.IDCS_PortalContent t where t.docid=:old.DOCID;
elsif t_field.MODIFYSTATE =2 and t_field.DEALUSERACCOUNT is null then --修改记录 未处理未过滤
update IDCSSite.IDCS_PortalContent t set t.modifystate=3,t.modifydate=sysdate,HIDESTATE=0 where t.docid=:old.DOCID;
else
insert into IDCSSite.IDCS_PortalContent(guid,docid,doctitle,modifystate,modifydate,inputstate,hidestate)
values(sys_guid(),:old.DOCID,:old.DOCTITLE,3,sysdate,0,0);
end if;
end loop;
else
insert into IDCSSite.IDCS_PortalContent(guid,docid,doctitle,modifystate,modifydate,inputstate,hidestate)
values(sys_guid(),:old.DOCID,:old.DOCTITLE,3,sysdate,0,0);
end if;
close cur_temp;
elsif updating then
open cur_temp;
if cur_temp%rowcount>0 then
FOR t_field in cur_temp LOOP
if t_field.MODIFYSTATE =1 and t_field.DEALUSERACCOUNT is null and t_field.HIDESTATE=0 then--新增记录 未处理未过滤
update IDCSSite.IDCS_PortalContent t set t.modifydate=sysdate where t.docid=:new.DOCID;
elsif t_field.MODIFYSTATE =2 and t_field.DEALUSERACCOUNT is null then --修改记录 未处理
update IDCSSite.IDCS_PortalContent t set t.modifydate=sysdate, HIDESTATE =0 where t.docid=:new.DOCID;
else
insert into IDCSSite.IDCS_PortalContent(guid,docid,doctitle,modifystate,modifydate,inputstate,hidestate)
values(sys_guid(),:new.DOCID,:new.DOCTITLE,2,sysdate,0,0);
end if;
end loop;
else
insert into IDCSSite.IDCS_PortalContent(guid,docid,doctitle,modifystate,modifydate,inputstate,hidestate)
values(sys_guid(),:new.DOCID,:new.DOCTITLE,2,sysdate,0,0);
end if;
close cur_temp;
end if;
end wcmdocument_IDCS;
/
难点解析:
1、跨用户执行操作,需要增加权限
2、判断另一用户下的表的内容,需要使用cursor,并对cursor中的字段进行判断
3、判断cursor是否为null,这个我不知道语法应该怎么写,用另外再取了一次数据,增加了连接次数
4、删除的时候要用:old.docid,不能用:new.docid