zoukankan      html  css  js  c++  java
  • 利用触发器实现数据同步

     数据同步问题:

      在 SQL Server 2008 R2 中进行数据库表数据同步时,由于数据量大,常常需要进行增量同步。如果表结构设计良好,如包含修改时间字段、只做软删除,做增量同步比较容易实现。对于不包含修改时间字段的表,如何做增量同步?1、可以根据主键字段找到同一条记录,然后对比其他所有的字段来确定是否有修改,类似确定是否新增(此方法太过复杂)。2、在源表中添加触发器,并新建一个中间记录表用来记录触发信息,然后在后台任务中根据中间表的记录来同步数据。

      下面就是针对方法 2 的具体实现:

      (注意:a. 如果每次有多条增删改语句合并在一起执行,则需要用游标从 INSERTED 和 DELETED 表中依次取出每条记录。b. 多条语句的操作类型必须一样,如都是新增语句、修改语句、删除语句,如果有两种语句混合在一起,则无法区分每条语句的具体操作类型(是增还是删),这种情况下只能采取方法 1 实现了。)

    --SQL Server 2008 批量插入数据时,触发器脚本实例
    ALTER TRIGGER [dbo].[T_Name]
       ON  [dbo].[HT_CurrentTagRecord]
       AFTER INSERT
    AS 
    BEGIN
        -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        SET NOCOUNT ON;
    
        --INSERT
        BEGIN     
            declare @I_Code nvarchar(20);
            declare @I_CreateTime datetime;
            declare @I_WorkState int;
            
            declare MyCursor cursor for
            SELECT Code, CreateTime, WorkState FROM INSERTED 
            open MyCursor;
            fetch next from MyCursor into @I_Code, @I_CreateTime, @I_WorkState; --不判断@I_CreateTime是否大于当前的StartTime了,因为批量发过来的数据中都是一个标签一条数据
            while @@fetch_status=0    --循环读取
            begin
                declare @Id int;        
                declare @Code nvarchar(20);
                declare @StartTime datetime;
                declare @StopTime datetime;
                
                if(exists(SELECT 1 FROM DBName.dbo.StaticsTable S WHERE Code = @I_Code))
                begin
                    SELECT top 1 @Id = Id, @Code = S.Code, @StartTime = S.StartTime, @StopTime = S.StopTime  --查询StaticsTable中最新的记录
                    FROM DBName.dbo.StaticsTable S
                    WHERE Code = @I_Code
                    order by S.Id desc;
                
                    --分析:
                    --如果最新的记录的终止统计时间(即StopTime)为空,说明该时间段设备还没关机
                    --如果最新的记录的终止统计时间(即StopTime)不为空,说明该时间段设备已关机
                    
                    --如果是新增的记录是 "关机" 数据记录
                    if(@I_WorkState = 0)
                    begin
                        if(ISNULL(@StopTime,'') = '')  --如果最新的记录的终止统计时间为空,说明该时间段的统计还没结束,则让其终止
                        begin
                            update DBName.dbo.StaticsTable set StopTime=@I_CreateTime,UseMinuteTime = DATEDIFF(n, @StartTime, @I_CreateTime) where Id = @Id;
                        end
                    end
                    else if(@I_WorkState = 1) --如果是新增的记录是 "开机" 数据记录
                    begin
                        if(ISNULL(@StopTime,'') = '')  --如果最新的记录的终止统计时间为空,说明该时间段的统计还没结束,则刷新该记录的使用时长
                        begin
                            if(ISNULL(@StartTime,'') = '')
                            begin
                                update DBName.dbo.StaticsTable set StartTime = @I_CreateTime, UseMinuteTime = 0 where Id = @Id;
                            end
                            else
                            begin
                                update DBName.dbo.StaticsTable set UseMinuteTime = DATEDIFF(n, @StartTime, @I_CreateTime) where Id = @Id;
                            end
                        end
                        else --如果最新的记录的终止时间不为空,表示该时间的统计已终止,则创建一条新的统计记录
                        begin
                            Insert into DBName.dbo.StaticsTable values(@I_Code, @I_CreateTime, null, 0);
                        end
                    end
                end
                else
                begin --如果StaticsTable表中未找到相应的记录,则插入一条初始记录
                    Insert into DBName.dbo.StaticsTable values(@I_Code, @I_CreateTime, null, 0);
                end
                
                fetch next from MyCursor into @I_Code, @I_CreateTime, @I_WorkState;
            end;
            close MyCursor;
            deallocate MyCursor;
        END
    END
  • 相关阅读:
    mysql第三天作业
    mysql第二天作业
    mysql第一天作业
    S5第一次月考
    网络编程(待补充)
    字符编码(待补充)
    继承和封装
    面向对象
    codeforces 394E Lightbulb for Minister 简单几何
    跟面试官讲Binder(零)
  • 原文地址:https://www.cnblogs.com/hellowzl/p/10385025.html
Copyright © 2011-2022 走看看