SQL 触发器,用于仅在表上的更新更改具有特定值时还原另一列



我正在尝试为之前作为相当简单的工作完成的工作编写一个触发器,以便在更改后立即触发。这是作业的代码。

UPDATE       GrdFelde
SET                GrdInhalt = 0
WHERE        (GrdNummer LIKE 'BEST[A-Z][A-Z]%2') AND (GrdInhalt <> 0)

这就是我目前所拥有的。

CREATE TRIGGER [dbo].[GrdFelde_UTrig_Custom] ON [dbo].[GrdFelde] FOR UPDATE AS
SET NOCOUNT ON
IF UPDATE(GrdInhalt)
BEGIN
UPDATE       GrdFelde
SET                GrdInhalt = 0
WHERE        (GrdNummer LIKE 'BEST[A-Z][A-Z]%2') AND (GrdInhalt <> 0)
END

我是触发器的新手,不确定这是否有效。我的问题是,这是一个存储对用户界面的所有更改的表,因此它经常更新,我不想引起性能问题。触发器是否有可能仅在满足 WHERE 条件时触发?如果是,我会把这个声明放在哪里?

每当在表上执行更新语句时,都会触发触发器。这是无法控制的(除了完全禁用触发器(。
但是,您可以编写它以获得更好的性能。

  1. 即使 update/insert 语句失败,UPDATE()函数也会返回1,因此您可能不想将其用作指示符。

  2. 触发器中没有对inserteddeleted表的引用,这意味着它可能会影响触发器的原始更新语句中未包含的记录。

我可能会这样写这个触发器:

CREATE TRIGGER [dbo].[GrdFelde_UTrig_Custom] ON [dbo].[GrdFelde] 
FOR UPDATE AS
SET NOCOUNT ON
UPDATE t
SET GrdInhalt = 0
FROM GrdFelde t
JOIN INSERTED i ON t.<PKColumn(s)> = i.<PKColumn(s)>
JOIN DELETED d  ON t.<PKColumn(s)> = d.<PKColumn(s)>
WHERE t.GrdNummer LIKE 'BEST[A-Z][A-Z]%2'
AND t.GrdInhalt <> 0
AND ISNULL(CAST(i.GrdInhalt AS INT), -1) <> ISNULL(CAST(d.GrdInhalt AS INT), -1)
GO

请注意

  1. 通过联接inserted表和deleted表,我确保触发器仅更改触发它的语句影响的行。

  2. <PKColumn(s)>更改为构成表主键的列。

  3. 我正在强制转换为int并指定 null 值的-1,以处理从 null 更改为值或从值更改为 null 的情况。如果您的列已经是 int,则强制转换是多余的。如果-1是有效值,则可能需要考虑强制转换为varchar(11)并将null替换为空字符串。

最新更新