我们有一个包含status列的表,并且与它相关联的是一个用于跟踪状态更改值的列。
例如,我们的状态为“Off”,状态为“Found”,以及关联的列DateOff和DateFoundOff。我正在尝试创建一个触发器,以便在状态更改时更新这些日期列。
在我看来,这似乎相当简单,但发生的情况是,当Status更改关联的date列时,正确更新,而其他date列变为null。因此,如果我更改状态= 'Off‘,DateOff有正确的日期,但DateFoundOff变为空,而visa则相反。
我创建了两个触发器-第一个是:
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我只是不明白一个触发器如何将日期列的值更改为空,而该值与当前状态值没有关联。
谢谢。
编辑:发现问题不在于触发器,而在于用于编辑数据的工具是如何保存某些东西的。我不确定为什么,但通过更改编辑工作流,问题得到了解决。在此基础上将答案标记为正确,从而为编写触发器提供了更好的方法。
发布于 2021-07-06 20:16:19
您的update语句都没有将DateFoundOff或DateOff更改为null。一定有别的事情发生了。
但是,我会将您的触发器改进如下:
deleted表的检查,实际检查值是否更改。ALTER TRIGGER [GIS].[UPDATE_FOUNDOFF]
ON [GIS].[METEROUTAGEPOINTS]
AFTER UPDATE
AS
BEGIN
-- Avoid doing any processing if no rows are updated
IF NOT EXISTS (SELECT 1 FROM Inserted) RETURN;
SET NOCOUNT ON;
IF UPDATE(OutageStatus) BEGIN
UPDATE [gis].[METEROUTAGEPOINTS] SET
DateFoundOff = CASE WHEN i.OutageStatus = 'Found Off' AND d.OutageStatus <> 'Found Off' THEN CURRENT_TIMESTAMP ELSE DateFoundOff END
, DateOff = CASE WHEN i.OutageStatus = 'Off' AND d.OutageStatus <> 'Off' THEN CURRENT_TIMESTAMP ELSE DateOff END
FROM gis.METEROUTAGEPOINTS mop
INNER JOIN inserted AS i ON i.ConObject = mop.ConObject
INNER JOIN deleted AS d ON d.ConObject = mop.ConObject;
END;
END;https://stackoverflow.com/questions/68276726
复制相似问题