【发布时间】:2021-06-26 21:51:24
【问题描述】:
我想创建一个触发器,该触发器在更改表 Y 中列 X 中的记录内容后被调用,并显示表 中有多少条记录>Y 列 X 中的先前内容。
例如,
- 将记录字段“颜色”从“蓝色”更改为“绿色”,
- 显示当前有多少条“颜色”字段设置为“蓝色”的记录。
这是我已经尝试过的:
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