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
中只有一行 - 情况并非总是如此。如果您的 INSERT
或 UPDATE
操作影响多行,触发器被调用 整个语句仅一次 ,并且伪表将包含 多行!
您需要运用这些知识,并以完全基于设置的 方式编写您的触发器 - 不要使用任何 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
我正在尝试将 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
中只有一行 - 情况并非总是如此。如果您的 INSERT
或 UPDATE
操作影响多行,触发器被调用 整个语句仅一次 ,并且伪表将包含 多行!
您需要运用这些知识,并以完全基于设置的 方式编写您的触发器 - 不要使用任何 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