UPDATE 触发器返回更新值和先前值

问题描述 投票:0回答:2

我正在尝试创建一个触发器,每当更新记录时,该触发器就会将记录从一个表插入到另一个表中。

CREATE TRIGGER [dbo].[trg_tblContent_backup_update] 
   ON [dbo].[tblContent]
   FOR UPDATE
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

     INSERT INTO tblContentUpdateBackup 
     (
        ContentID,
        revision,
        CountryID,
        QualificationID,
        ContentTitle,
        CourseID,
        ContentOrder,
        ContentStatus,
        ContentTypeID,
        Content,
        GenericPageID,
        GenericDisplay,
        altLanguage,
        locationID,
        languageID,
        defaultLanguage,
        courseGenericID,
        moduleID,
        ThemePageID,
        contentRelateID,
        alantestID,
        ContentBackup,
        LastModified,
        ProgrammeID,
        temp_contentRelateID
     
     )
     SELECT 
     
        ContentID,
        revision,
        CountryID,
        QualificationID,
        ContentTitle,
        CourseID,
        ContentOrder,
        ContentStatus,
        ContentTypeID,
        Content,
        GenericPageID,
        GenericDisplay,
        altLanguage,
        locationID,
        languageID,
        defaultLanguage,
        courseGenericID,
        moduleID,
        ThemePageID,
        contentRelateID,
        alantestID,
        ContentBackup,
        CURRENT_TIMESTAMP,
        ProgrammeID,
        temp_contentRelateID
     
     
     FROM INSERTED
    -- Insert statements for trigger here

END
GO

我构建的上面的触发器将 tblContent 中的先前记录和更新记录插入到 tblContentUpdateBackup 中,但是我只想要先前记录。

我就快到了,任何帮助将不胜感激。

谢谢

sql sql-server database triggers
2个回答
0
投票

为我们工作的一位自由开发人员提出了以下解决方案,这似乎可以完成工作:

嗨@alacoleman

所以自从我们聊天以来,经过各种测试和阅读,我已经花了几个小时在这上面,我发现唯一看起来有效的方法是使用 TRIGGER_NESTLEVEL() 条件(在这里找到了一些东西https: //clivesyabb.com/2014/08/06/avoiding-recursive-triggers-in-sql-vs-avoiding-nested-execution/

当我测试时,我可以看到触发器被调用了两次(由于我还没有解决的原因),所以通过使用

如果(TRIGGER_NESTLEVEL())= 1

在对备份表进行任何插入之前,我们可以确保它之前没有被触发过。

如果你想看一下,我已经更新了 trg_tblContent_backup_update 触发器 - 当我测试时似乎正在工作!


0
投票

上面的方法对我来说不起作用,但是添加旧的 WHERE 串联 != 新的串联会阻止当前值写入历史表(使用插入和删除表)。我也经历过更新后触发器将旧的和新的写入历史。这仅发生在应用程序中,而不是在 SQL SERVER 中测试 CRUD 操作时发生。

© www.soinside.com 2019 - 2024. All rights reserved.