`
pesome
  • 浏览: 68044 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

数据库同步trigger的记录

阅读更多

    项目需要写了几个数据库同步用的 trigger ,就是记录用户的操作到一个 temp 表,然后每天通过 webservice 同步到其它系统,同步成功清空该 temp 表。自认为写的还行,做个记录。是 db2 的。

<!----> <o:p> </o:p>

-- 用户组新增触发器

--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

<o:p> </o:p>

  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;

<o:p> </o:p>

  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;

<o:p> </o:p>

  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;          

<o:p> </o:p>

<o:p> </o:p>

-- 删除用户组触发器

--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;

分享到:
评论

相关推荐

    基于SQL Server的数据库同步原理研究.pdf

    在简单数据库同步的设计方案中,会创建一张操作记录表,记录操作对象的编号、操作类型、操作时间以及是否已同步的状态。这些操作记录表通过触发器(Trigger)来实现。触发器会在插入、删除和更新操作发生时被触发,...

    SQLServer同步其他数据库的一种方法

    在SQL Server中,同步其他异构数据库是一种常见的需求,特别是在多数据源整合或者实时数据交换的场景下。本文将详细探讨一种不依赖于特定编程语言,而是通过触发器和批处理文件来实现的方法。 首先,我们需要理解...

    数据库触发器学习资料

    3. 业务逻辑处理:例如,订单总额计算、库存同步等,可以在数据插入或更新时自动完成。 四、创建和管理触发器 1. 创建触发器:使用CREATE TRIGGER语句定义触发器,包括指定触发器的名称、触发时机、执行的操作等。...

    数据库结构和数据对比工具

    3. 差异同步(Synchronization):一旦找到差异,工具通常提供功能将一个数据库的结构或数据更新到另一个数据库,以保持一致性。 4. 报告生成(Report Generation):生成详细的对比报告,帮助数据库管理员理解差异...

    如何使用触发器管理MySQL数据库

    使用`SHOW TRIGGER`命令可以查看数据库中的所有触发器及其详细信息,确认触发器是否已正确创建并处于激活状态。 5. **测试触发器**: 插入新的记录到`data`表,触发器会自动执行其定义的动作。在示例中,插入'...

    Create-trigger.zip_sql create trigger_sql 触发_trigger

    在SQL(Structured Query Language)中,触发器(Trigger)是一种数据库对象,用于在特定的数据操作(如INSERT、UPDATE或DELETE)发生时自动执行预定义的SQL语句或存储过程。触发器可以用来实现复杂的业务规则,确保...

    SQL数据库触发器练习题

    - 更新触发器可用于在修改记录后更新其他相关记录,例如,在员工工资表中,当员工的工资发生变化时,同步更新其税务信息。 - DELETE触发器可以用来跟踪删除的信息,创建一个历史表来保存被删除的记录。 通过以上...

    SQL数据库 触发器课件

    - **级联更改**:可以通过触发器实现对相关表的数据同步更新,如在删除一条记录时,联动删除相关表的关联记录。 - **数据验证**:类似于CHECK约束,可以限制插入不符合规则的数据,确保数据质量。 3. **创建...

    数据库触发器的ppt

    通过触发器,开发者可以确保数据的一致性和完整性,同时也可以实现一些自定义的业务逻辑,例如防止非法数据插入、删除或更新,以及同步相关表的数据等。触发器的应用使得数据库管理系统更加灵活和强大,但也需谨慎...

    数据库学习中的触发器

    【数据库触发器详解】 数据库触发器是数据库管理系统中一种特殊类型的存储过程,它不...在实际应用中,触发器可以用来执行复杂的业务逻辑,例如审计跟踪、数据转换、历史记录保存等,是数据库设计和管理的重要工具。

    OGG配置DDL数据同步

    在源数据库中建立一个全库级别的Trigger来捕捉DDL操作,并将这些操作记录到中间表。Extract进程读取中间表中的DDL语句,并与DML语句一起根据CSN(Commit Sequence Number)进行排序,然后由Pump进程投递到目标端。...

    SQL_两张表同步数据

    在企业级应用中,有时我们需要实现在两个不同的数据库之间进行数据同步,比如将一张表中的数据实时地复制到另一张表中,这种需求通常可以通过触发器(Trigger)来实现。本文将详细介绍如何通过创建触发器来监控两张...

    数据库触发器是一种存储过程

    以下是一个简单的触发器示例,假设我们有学生表(Student)和借书记录表(BorrowRecord),当更新学生表的学号时,我们希望同步更新借书记录表中的相关记录: ```sql CREATE TRIGGER truStudent ON Student FOR UPDATE ...

    Spring+Quartz 从数据库中获取定时任务和定时时间,动态实现对定时任务的增删改查

    Quartz支持从数据库存储作业和触发器,这样可以方便地进行任务的持久化和集群环境下的任务同步。 1. **Spring与Quartz的集成**:Spring提供了与Quartz的无缝集成,通过`Spring-Job`和`Spring-Trigger`接口,我们...

    论文研究-异构数据库集成中的变化捕获方案设计.pdf

    2. 触发器(Trigger)的使用:在源数据库中设置触发器,以便在数据变更发生时自动记录相关信息到变更轨迹表中。触发器是一种特殊的存储过程,它会在数据库中发生的特定事件(如INSERT、UPDATE、DELETE)之后自动执行...

    数据库运维说明书 (3) 数据库运维.docx

    - **定义**:数据库的日志记录方式。 - **作用**:影响数据库的数据保护策略。 #### 6. 打开模式 - **定义**:数据库当前的运行状态。 - **作用**:确保数据库处于正确的工作状态。 #### 7. 数据库角色 - **定义**...

    Springboot整合Quartz实现定时任务数据库动态配置

    同时,我们需要根据业务逻辑更新数据库中的JobDetail和Trigger记录。 最后,我们可以创建一个Controller,提供RESTful API来调用`JobService`的方法,实现前端对定时任务的控制。 通过以上步骤,我们就成功地在...

    数据库 SQL触发器实例讲解.doc

    触发器的主要作用是确保当`Student`表中的数据发生变化时,`BorrowRecord`表中的相关记录也能同步更新或删除,以保持数据的一致性。 1. 更新触发器(Update Trigger): 当`Student`表中的`StudentID`字段被更新时...

    数据库自动化的魔法:精通数据库触发器的使用

    - **自动更新相关表的数据**:例如,在一个表中更新数据时,同步更新另一个表中的相关记录。 - **记录数据变更历史**:自动记录数据更改的时间戳、操作人等信息。 - **执行复杂的业务逻辑**:处理复杂的业务流程,如...

Global site tag (gtag.js) - Google Analytics