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

时间:2018-10-02 07:44:59

标签: sql-server tsql triggers

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

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 个答案:

答案 0 :(得分:1)

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

  1. 即使更新/插入语句失败,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. 通过连接inserteddeleted表,我确保触发器仅更改触发它的语句所影响的行。

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

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