【问题标题】:SQL Trigger for reverting an update change on a table only when another column has specific values仅当另一列具有特定值时才恢复对表的更新更改的 SQL 触发器
【发布时间】:2018-10-02 07:44:58
【问题描述】:

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

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 条件时触发?如果是的话,我会把这个声明放在哪里?

【问题讨论】:

    标签: sql-server tsql triggers


    【解决方案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. &lt;PKColumn(s)&gt; 更改为构成表主键的列。

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

    【讨论】:

    • 这很有魅力。现在该应用程序总是在没有选择任何内容的情况下启动,这节省了大量时间。非常感谢。
    猜你喜欢
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    相关资源
    最近更新 更多