SQL 用于插入或更新的服务器触发器

SQL Server trigger for insert or updated

我正在尝试将 table EditingField_Poly 和列 Send_Email 从 'Yes' 编辑为 'No'。它不允许我保存编辑...当我禁用触发器时,它可以让我保存。这个触发器应该查看是否有新的插入或对这 2 列的任何更新 - 如果有那么它将 Send_Email 列中的状态从 "No" 更改为 "Yes"

谁能帮我解决这个触发器的问题?

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[Send_Email]
ON [dbo].[EDITINGFIELD_POLY]
FOR UPDATE, INSERT
AS
    IF (UPDATE([Status]) or UPDATE([Department]))
    BEGIN
          SET NOCOUNT ON;

          DECLARE @OID int;
          SELECT @OID = i.OBJECTID from inserted i;

          UPDATE [dbo].[EDITINGFIELD_POLY] 
          SET Send_Email = 'Yes' 
          WHERE OBJECTID = @OID            
END
GO

您的触发器 存在严重缺陷 因为它假定 Inserted 中只有一行 - 情况并非总是如此。如果您的 INSERTUPDATE 操作影响多行,触发器被调用 整个语句仅一次 ,并且伪表将包含 多行!

您需要运用这些知识,并以完全基于设置的 方式编写您的触发器 - 不要使用任何 SELECT @OID = Inserted.ObjectID 样式代码!

此外,由于您正在检查 UPDATE 情况下两行中的某一行是否已更改,因此您无法在组合触发器中轻松执行此操作 - 我建议使用两个单独的触发器,一个用于 INSERT, 一个用于 UPDATE.

试试这个:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[trg_Send_Email_Update]
ON [dbo].[EDITINGFIELD_POLY]
FOR UPDATE
AS
    UPDATE [dbo].[EDITINGFIELD_POLY] 
    SET Send_Email = 'Yes' 
    FROM Inserted i
    INNER JOIN Deleted d ON i.OBJECTID = d.OBJECTID
    WHERE [dbo].[EDITINGFIELD_POLY].OBJECTID = i.OBJECTID
      AND (d.Status <> i.Status OR d.Department <> i.Department)
GO

ALTER TRIGGER [dbo].[trg_Send_Email_Insert]
ON [dbo].[EDITINGFIELD_POLY]
FOR INSERT
AS
    UPDATE [dbo].[EDITINGFIELD_POLY] 
    SET Send_Email = 'Yes' 
    FROM Inserted i
    WHERE [dbo].[EDITINGFIELD_POLY].OBJECTID = i.OBJECTID
GO