我正在尝试为之前做的相当简单的工作编写一个触发器,以便在更改后立即触发。这是工作的代码。
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条件时才触发触发器?如果是的话,我将在哪里发表这一声明?
答案 0 :(得分:1)
每当在表上执行更新语句时,都会触发触发器。这是无法控制的(完全禁用触发器除外)。
但是,您可以编写它以获得更好的性能。
即使更新/插入语句失败,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
,并为-1
指定空值,以处理从空值更改为值或从值更改为空的情况。如果您的列已经是一个int,则强制转换是多余的。如果-1
是有效值,则可能需要考虑强制转换为varchar(11)
并将null
替换为空字符串。