对于单个更新,复制记录会多次触发

时间:2014-05-28 14:41:11

标签: sql-server sql-server-2012

设置从另一台服务器复制的SQL Server 2012表; 更新/插入触发器(在复制的表A上)在单个记录更新时触发多次;

触发器的内容是:

BEGIN
IF (UPDATE(AdmitDate) AND UPDATE(AdmitTime)) OR (UPDATE(DischargeDate) AND UPDATE(DischargeTime)) --Check to see if any of the relevant conditions have changed
BEGIN --This is automatically true for an insert assumed they were originally null
    BEGIN TRY
        SET NOCOUNT ON

        -- Get patient's chartnumber through the inserted record
        SELECT  @ChartNumber = i.ChartNumber FROM inserted i
        SET @DatabaseName=Convert(Varchar(100),DB_NAME())

        SET @user=CURRENT_USER;
        SET @message = 'ChartNumber[' + @ChartNumber+'], Database Name:[' +@DatabaseName+']';
        Execute [sp_APP-Log-Entry]  @user, '5000', 0, 0,  'Trigger on AB_Abstract', '26', @message; -------------------------------------------------------

    END TRY
    BEGIN CATCH
        --IF XACT_STATE() = -1 ROLLBACK;  -- REPLICATION WILL DIE ANYWAY ON ANY ERROR. 
        INSERT INTO X_HUDB.dbo.[App-Response_log]
            VALUES (CONVERT(sysname, CURRENT_USER), ERROR_NUMBER(), ERROR_SEVERITY(), ERROR_STATE(), ERROR_PROCEDURE(), 
                    ERROR_LINE(), ERROR_MESSAGE(), getdate())
    END CATCH
END

END

怎么会发生这种情况?我意识到有UPDATE条件,但是它应该指示[sp_APP-Log-Entry]被调用的次数更少,但是现在它为复制记录调用2到7次,但是如果我使用更新查询更新多个字段则只有ONCE来自不同数据库实例的非复制表。

(我看不到任何错误,否则会破坏复制)

1 个答案:

答案 0 :(得分:0)

记录在源系统中通过多个业务规则多次更新(在几毫秒内)。事实证明,复制工作有点过于完美。

也许墨菲需要见到奥卡姆。

尽管如此,我还是会远离一个电子邮件或与触发器相关联的复杂逻辑,这只是被复制的系统是一个包。使用来自触发器的一些元数据在插入/删除的表格上每分钟轮询将比实时更好,因为权衡了不良设计模式的固有不稳定性。