业务是这样:
触发过来的记录有以下一些判断约束:
新增:无约束,新增一条数据变动。
修改
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