【发布时间】:2025-11-22 00:55:02
【问题描述】:
设置从另一台服务器复制的 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
结束
怎么会这样?我意识到有 UPDATE 条件,但它应该表明 [sp_APP-Log-Entry] 被调用的次数更少,但现在它为复制记录调用 2 到 7 次,但如果我使用更新查询更新多个字段,则只有一次来自不同数据库实例的非复制表。
(我看不到任何错误,否则会破坏复制)
【问题讨论】:
-
inserted可以包含 0、1 或 多个 行。SELECT @ScalarVariable = column FROM inserted是一个错误的概念。此外,您应该避免命名以sp_开头的存储过程。最后,关于您的问题,您是否考虑过将触发器标记为NOT FOR REPLICATION?
标签: sql-server sql-server-2012