设置从另一台服务器复制的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来自不同数据库实例的非复制表。
(我看不到任何错误,否则会破坏复制)
答案 0 :(得分:0)
记录在源系统中通过多个业务规则多次更新(在几毫秒内)。事实证明,复制工作有点过于完美。
也许墨菲需要见到奥卡姆。
尽管如此,我还是会远离一个电子邮件或与触发器相关联的复杂逻辑,这只是被复制的系统是一个包。使用来自触发器的一些元数据在插入/删除的表格上每分钟轮询将比实时更好,因为权衡了不良设计模式的固有不稳定性。