我正在尝试为之前作为相当简单的工作完成的工作编写一个触发器,以便在更改后立即触发。这是作业的代码。
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 条件时触发?如果是,我会把这个声明放在哪里?
每当在表上执行更新语句时,都会触发触发器。这是无法控制的(除了完全禁用触发器(。
但是,您可以编写它以获得更好的性能。
-
即使 update/insert 语句失败,
UPDATE()
函数也会返回1
,因此您可能不想将其用作指示符。 -
触发器中没有对
inserted
或deleted
表的引用,这意味着它可能会影响触发器的原始更新语句中未包含的记录。
我可能会这样写这个触发器:
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
请注意:
通过联接
inserted
表和deleted
表,我确保触发器仅更改触发它的语句影响的行。将
<PKColumn(s)>
更改为构成表主键的列。我正在强制转换为
int
并指定 null 值的-1
,以处理从 null 更改为值或从值更改为 null 的情况。如果您的列已经是 int,则强制转换是多余的。如果-1
是有效值,则可能需要考虑强制转换为varchar(11)
并将null
替换为空字符串。