【问题标题】:Trigger to detect changes in column value触发以检测列值的变化
【发布时间】:2021-06-26 21:51:24
【问题描述】:

我想创建一个触发器,该触发器在更改表 Y 中列 X 中的记录内容后被调用,并显示表 中有多少条记录>YX 中的先前内容。

例如,

  1. 将记录字段“颜色”从“蓝色”更改为“绿色”,
  2. 显示当前有多少条“颜色”字段设置为“蓝色”的记录。

这是我已经尝试过的:

USE [DTBS]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[dbo.how_many]
   ON [dbo].[Person]
   FOR INSERT, UPDATE
AS BEGIN
    SET NOCOUNT ON;
    IF UPDATE (color)
        BEGIN

        DECLARE @color VARCHAR(32);
        DECLARE @count INT;

        SELECT @color = color FROM deleted;

        SELECT @count = COUNT(id)
        FROM Person
        WHERE Person.color = @color

        PRINT (@count)
    END
END

我正在使用 SQL Server Management Studio 2019,目前当我尝试调用触发器时没有任何反应。

【问题讨论】:

  • 您需要阅读Inserted & Deleted Tables,因为您没有考虑到它们可以有 0-N 行。此外,虽然 print 可以帮助您调试,但您不想将其留在那里进行生产 - 没有从触发器返回值的机制。
  • 因此您还需要处理多个颜色可能在同一次更新中发生变化的事实。您还将它定义为插入触发器(除了更新),插入触发器没有先前的值。
  • IF UPDATE 不会按照你的想法去做。如果您想知道某件事实际上发生了变化,则需要进行比较。
  • 仅供参考 SSMS 纯粹是一个客户端界面。它不是数据库引擎。

标签: sql sql-server tsql triggers


【解决方案1】:
  1. 您需要了解Inserted & Deleted Pseudo Tables,因为它们可以有 0-N 行,而您的触发器需要处理它。使用基于集合的方法可以解决这个问题。

  2. 这导致您可能需要同时更新多种颜色。

  3. 如果您正在检测更改并想要访问旧值,则不需要INSERT 触发器。

  4. 触发器并非旨在返回数据。我已经向您展示了如何捕获您想要的信息,但最终您需要一种不同的机制来利用它,例如插入到不同的表中。

ALTER TRIGGER [dbo].[dbo.how_many]
    ON [dbo].[Person]
    FOR UPDATE
AS BEGIN
    SET NOCOUNT ON;
   
    IF UPDATE (color) BEGIN

        -- This gives *all* the old colours prior to update
        SELECT D.Color
        FROM Inserted I
        INNER JOIN Deleted D ON D.id = I.id -- One assumes you have an id column
        -- Assuming Color is never null
        WHERE D.Color != I.Color
        GROUP BY D.Color;

        -- If you then want a count you would do
        SELECT COUNT(id), Color
        FROM Person
        WHERE Person.Color IN (
            -- Repeat query from above
            SELECT D.Color
            FROM Inserted I
            INNER JOIN Deleted D ON D.id = I.id
            WHERE D.Color != I.Color
            GROUP BY D.Color
        )
        GROUP BY Color;

    END;
END;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-28
    • 2018-10-22
    • 2017-12-03
    • 2018-06-28
    • 1970-01-01
    • 2017-06-04
    • 2021-08-19
    相关资源
    最近更新 更多