首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >触发器:根据另一列的值更新列

触发器:根据另一列的值更新列
EN

Stack Overflow用户
提问于 2021-07-06 19:58:10
回答 1查看 898关注 0票数 0

我们有一个包含status列的表,并且与它相关联的是一个用于跟踪状态更改值的列。

例如,我们的状态为“Off”,状态为“Found”,以及关联的列DateOffDateFoundOff。我正在尝试创建一个触发器,以便在状态更改时更新这些日期列。

在我看来,这似乎相当简单,但发生的情况是,当Status更改关联的date列时,正确更新,而其他date列变为null。因此,如果我更改状态= 'Off‘,DateOff有正确的日期,但DateFoundOff变为空,而visa则相反。

我创建了两个触发器-第一个是:

代码语言:javascript
运行
复制
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

第二次

代码语言:javascript
运行
复制
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

我只是不明白一个触发器如何将日期列的值更改为空,而该值与当前状态值没有关联。

谢谢。

编辑:发现问题不在于触发器,而在于用于编辑数据的工具是如何保存某些东西的。我不确定为什么,但通过更改编辑工作流,问题得到了解决。在此基础上将答案标记为正确,从而为编写触发器提供了更好的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-06 20:16:19

您的update语句都没有将DateFoundOffDateOff更改为null。一定有别的事情发生了。

但是,我会将您的触发器改进如下:

  1. 只使用单个触发器,每个触发器都有开销,一个带有一个update语句的触发器运行速度将超过2。
  2. 实际上没有检查状态是否已更改,您正在检查的只是该更新包含了该列。添加对deleted表的检查,实际检查值是否更改。

代码语言:javascript
运行
复制
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;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68276726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档