【发布时间】:2021-09-17 10:48:30
【问题描述】:
我们有一个包含状态列的表,并且与该列关联的是用于跟踪状态何时更改值的列。
例如,我们的状态为“关闭”和“发现关闭”状态以及关联的列DateOff 和DateFoundOff。我正在尝试创建触发器以在状态更改时更新这些日期列。
这对我来说似乎很简单,但是当Status 正确更改关联的日期列更新,但另一个日期列变为空时,会发生这种情况。因此,如果我更改 Status = 'Off' DateOff 的日期正确,但 DateFoundOff 变为空,反之亦然。
我创建了两个触发器 - 第一个是:
ALTER TRIGGER [GIS].[UPDATE_FOUNDOFF]
ON [GIS].[METEROUTAGEPOINTS]
AFTER UPDATE
AS
IF (UPDATE (OutageStatus))
BEGIN
SET NOCOUNT ON;
UPDATE [gis].[METEROUTAGEPOINTS]
SET DateFoundOff = CURRENT_TIMESTAMP
FROM gis.METEROUTAGEPOINTS mop
INNER JOIN inserted AS i ON i.ConObject = mop.ConObject
WHERE i.OutageStatus = 'Found Off'
END
第二个
ALTER TRIGGER [GIS].[UPDATE_DATES]
ON [GIS].[METEROUTAGEPOINTS]
AFTER UPDATE
AS
IF (UPDATE (OutageStatus))
BEGIN
SET NOCOUNT ON;
UPDATE [gis].[METEROUTAGEPOINTS]
SET DateOff = CURRENT_TIMESTAMP
FROM gis.METEROUTAGEPOINTS mop
INNER JOIN inserted AS i ON i.ConObject = mop.ConObject
WHERE i.OutageStatus = 'Off'
END
我只是不明白一个触发器如何将 Date 列的值更改为与当前状态值无关的 null。
谢谢。
编辑:发现问题不在于触发器,而在于用于编辑数据的工具如何保持某些东西。不知道我明白为什么,但是通过更改编辑工作流程问题得到了解决。将答案标记为正确,因为它提供了一种更好的方法来编写触发器
【问题讨论】:
-
表的主键是什么?
-
请注意,IF UPDATE 没有达到您的预期。如果您只想在值实际更改时执行某些操作,则需要检查之前(删除)版本与之后(插入)版本。
-
我建议设置一个 dbfiddle,因为它目前无法重现。
-
我投票结束这个问题,因为我是 OP 我发现这个问题与帖子中提出的问题无关
标签: sql sql-server tsql triggers sql-update