项目需要写了几个数据库同步用的 trigger ,就是记录用户的操作到一个 temp 表,然后天天通过webservice 同步到其它系统,同步成功清空该 temp 表。自认为写的还行,做个记录。是 db2 的。-- 用户组新增触发器 --DROP TRIGGER TG_USERG; CREATE TRIGGER LIBING.TG_USERG AFTER INSERT ON LIBING.TM_USERG REFERENCING NEW AS NROW FOR EACH ROW MODE DB2SQL BEGIN ATOMIC declare @groupId integer; declare @name varchar(30); declare @descn varchar(100); declare @syntype varchar(4); declare @ddlsql varchar(1024); declare @isprimary char(1); declare @updateTime timestamp; declare @createTime timestamp; declare @createBy integer; declare @updateBy integer; declare @groupType integer; declare @adminType integer; declare @appId integer; declare @oldGroupId integer; set @groupId=NROW.GROUP_ID; set @name=NROW.name; set @descn=NROW.descn; set @syntype=NROW.syn_type; set @ddlsql=NROW.ddlsql; set @isprimary=NROW.isprimary; set @updateTime=NROW.update_time; set @createTime=NROW.create_time; set @createBy=NROW.create_by; set @updateBy=NROW.update_by; set @groupType=NROW.group_type; set @adminType=NROW.admin_type; set @appId=NROW.app_id; INSERT INTO TM_USERG_TEMP(GROUP_ID,NAME,DESCN,DDLSQL,ISPRIMARY,UPDATE_TIME,CREATE_TIME, CREATE_BY,UPDATE_BY,GROUP_TYPE,ADMIN_TYPE,APP_ID,ACTION) VALUES (@groupId,@name,@descn, @ddlsql,@isprimary,@updateTime,@createTime,@createBy,@updateBy,@groupType,@adminType,@appId,'INSERT'); END; -- 更新用户组数据的触发器 - DROP TRIGGER TG_USERG_UPDATE; CREATE TRIGGER TG_USERG_UPDATE AFTER UPDATE ON TM_USERG REFERENCING NEW AS NROW FOR EACH ROW MODE DB2SQL BEGIN ATOMIC declare @groupId integer; declare @name varchar(30); declare @descn varchar(100); declare @syntype varchar(4); declare @ddlsql varchar(1024); declare @isprimary char(1); declare @updateTime timestamp; declare @createTime timestamp; declare @createBy integer; declare @updateBy integer; declare @groupType integer; declare @adminType integer; declare @appId integer; set @groupId=NROW.GROUP_ID; set @name=NROW.name; set @descn=NROW.descn; set @syntype=NROW.syn_type; set @ddlsql=NROW.ddlsql; set @isprimary=NROW.isprimary; set @updateTime=NROW.update_time; set @createTime=NROW.create_time; set @createBy=NROW.create_by; set @updateBy=NROW.update_by; set @groupType=NROW.group_type; set @adminType=NROW.admin_type; set @appId=NROW.app_id; -- 假如已经有 update 则只记录最后一条 update IF EXISTS(SELECT GROUP_ID FROM TM_USERG_TEMP WHERE GROUP_ID=@groupId AND ACTION='UPDATE') THEN UPDATE TM_USERG_TEMP SET GROUP_ID=@groupId, NAME=@name,DESCN=@descn,DDLSQL=@ddlsql, ISPRIMARY=@isprimary,UPDATE_TIME=@updateTime, CREATE_TIME=@createTime,CREATE_BY=@createBy, UPDATE_BY=@updateBy,GROUP_TYPE=@groupType, ADMIN_TYPE=@adminType,APP_ID=@appId,ACTION='UPDATE' where GROUP_ID=@groupId AND ACTION='UPDATE'; -- 假如有 insert 则把后面的 update 当作 insert ELSEIF EXISTS(SELECT GROUP_ID FROM TM_USERG_TEMP WHERE GROUP_ID=@groupId AND ACTION='INSERT') THEN UPDATE TM_USERG_TEMP SET GROUP_ID=@groupId, NAME=@name,DESCN=@descn,DDLSQL=@ddlsql, ISPRIMARY=@isprimary,UPDATE_TIME=@updateTime, CREATE_TIME=@createTime,CREATE_BY=@createBy, UPDATE_BY=@updateBy,GROUP_TYPE=@groupType, ADMIN_TYPE=@adminType,APP_ID=@appId,ACTION='INSERT' where GROUP_ID=@groupId AND ACTION='INSERT'; ELSE INSERT INTO TM_USERG_TEMP(GROUP_ID,NAME,DESCN,DDLSQL,ISPRIMARY,UPDATE_TIME,CREATE_TIME, CREATE_BY,UPDATE_BY,GROUP_TYPE,ADMIN_TYPE,APP_ID,ACTION) VALUES (@groupId,@name,@descn, @ddlsql,@isprimary,@updateTime,@createTime,@createBy,@updateBy,@groupType,@adminType,@appId,'UPDATE'); end if; END; -- 删除用户组触发器 --DROP TRIGGER TG_USERG_DELETE; CREATE TRIGGER TG_USERG_DELETE AFTER DELETE ON TM_USERG REFERENCING OLD AS OROW FOR EACH ROW MODE DB2SQL BEGIN ATOMIC declare @groupId integer; declare @name varchar(30); declare @descn varchar(100); declare @syntype varchar(4); declare @ddlsql varchar(1024); declare @isprimary char(1); declare @updateTime timestamp; declare @createTime timestamp; declare @createBy integer; declare @updateBy integer; declare @groupType integer; declare @adminType integer; declare @appId integer; set @groupId=OROW.GROUP_ID; set @name=OROW.name; set @descn=OROW.descn; set @syntype=OROW.syn_type; set @ddlsql=OROW.ddlsql; set @isprimary=OROW.isprimary; set @updateTime=OROW.update_time; set @createTime=OROW.create_time; set @createBy=OROW.create_by; set @updateBy=OROW.update_by; set @groupType=OROW.group_type; set @adminType=OROW.admin_type; set @appId=OROW.app_id; -- 假如没有操作记录,则插入 delete 记录 IF NOT EXISTS(SELECT GROUP_ID FROM TM_USERG_TEMP WHERE GROUP_ID=@groupId) THEN INSERT INTO TM_USERG_TEMP(GROUP_ID,NAME,DESCN,DDLSQL,ISPRIMARY,UPDATE_TIME,CREATE_TIME, CREATE_BY,UPDATE_BY,GROUP_TYPE,ADMIN_TYPE,APP_ID,ACTION) VALUES (@groupId,@name,@descn, @ddlsql,@isprimary,@updateTime,@createTime,@createBy,@updateBy,@groupType,@adminType,@appId,'DELETE'); -- 假如有 insert 记录,则整体结果相当于没有进行任何操作 ELSEIF EXISTS(SELECT GROUP_ID FROM TM_USERG_TEMP WHERE GROUP_ID=@groupId and ACTION='INSERT') THEN DELETE FROM TM_USERG_TEMP WHERE GROUP_ID=@groupId and ACTION='INSERT'; -- 假如没有 insert 记录,则只需记录最后的 delete 操作 ELSE UPDATE TM_USERG_TEMP set ACTION='DELETE' where GROUP_ID=@groupId; END IF; END;
|