【问题标题】:Trigger in SQL Server 2012 compare and updateSQL Server 2012 中的触发器比较和更新
【发布时间】:2017-06-20 09:21:00
【问题描述】:

我想在 SQL Server 2012 中实现一个触发器,当更新查询被触发到表的列时,应该将该特定列中的现有值与新值进行比较。

如果新值更大,则只有表应该更新,否则不更新。

【问题讨论】:

    标签: sql triggers sql-server-2012 sql-update database-trigger


    【解决方案1】:

    请使用以下方法:

    CREATE TRIGGER trigger_For_Update1
    ON TableName
    FOR UPDATE
    AS BEGIN
        DECLARE @n_OldValue int,
                @n_NewValue int
    
        SELECT
            @n_OldValue = b.ValuesYouCompare, 
            @n_NewValue = a.ValuesYouCompare   -- Update  Old and New values
        FROM 
            inserted a, deleted b
    
        IF @n_NewValue > @n_OldValue
        BEGIN
            PRINT 'Transaction Error'
            ROLLBACK TRAN   -- Roll Back the transaction if condition is not valid
        END
    END
    

    【讨论】:

    • 您的触发器有 MAJOR 缺陷,因为您似乎认为它会每行调用一次 - 那是不是 b> 情况。触发器将每个语句触发一次,因此如果您的UPDATE 语句导致此触发器触发更新 25 行,您将触发触发器一次,但随后Inserteddeleted 伪表将分别包含 25 行。您的代码将在这 25 行中选择哪一行? SELECT ... FROM Inserted i - 它是非确定性的,您将获得任意一行,您将忽略所有其他行
    • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(25 年前),不鼓励使用它
    猜你喜欢
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    相关资源
    最近更新 更多