我正在尝试创建一个触发器,每当更新记录时,该触发器就会将记录从一个表插入到另一个表中。
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 中,但是我只想要先前记录。
我就快到了,任何帮助将不胜感激。
谢谢
为我们工作的一位自由开发人员提出了以下解决方案,这似乎可以完成工作:
嗨@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 触发器 - 当我测试时似乎正在工作!
上面的方法对我来说不起作用,但是添加旧的 WHERE 串联 != 新的串联会阻止当前值写入历史表(使用插入和删除表)。我也经历过更新后触发器将旧的和新的写入历史。这仅发生在应用程序中,而不是在 SQL SERVER 中测试 CRUD 操作时发生。