更新触发更好的方法

时间:2012-12-12 15:39:37

标签: tsql triggers sql-server-2008-r2

我正在开发一个触发器,希望它基本上处理Update语句意义上的更新,而不是那时担心DeleteInsert语句。 / p>

最终结果是我有两个状态字段active& inactivebit&分别为datetimeactive字段用于手动使记录无效,我希望确保inactive字段包含值active更改。

理想情况下,我想查看是否active=0并在记录字段中使用now()放置日期时间戳。长期我肯定我会想验证inactive字段已经没有日期时间戳,但是现在要覆盖它。同样,想要检查是否active=1并清除inactive字段(如果存在任何值)。

inactive字段为nullable,因此不存在冲突。

触发定义,截至目前:

CREATE TRIGGER dbo.TRG_tblRegistration_Inactive
ON dbo.tblRegistration
AFTER UPDATE
AS
BEGIN
    SET NOCOUNT ON;

    IF update(active) BEGIN

        update r
        set inactive=now()
        from tblRegistration r
            join inserted i on r.id = i.id
        where i.active = 0

    END
END

我非常了解inserted& deleted触发表。

问题:

  1. 触发器中是否有更好的逻辑模式可以让我达到最终目标?
  2. 如果他们使用inactiveactive=0active=1提交ALTER TRIGGER dbo.TRG_tblRegistration_Inactive ON dbo.tblRegistration AFTER UPDATE AS BEGIN SET NOCOUNT ON; IF update(active) BEGIN update r set inactive=getdate() from tblRegistration r join inserted i on r.id = i.id where i.active = 0 update r set inactive=NULL from tblRegistration r join inserted i on r.id = i.id where i.active=1 END END 值,则需要考虑哪些事项?
  3. 触发器的当前形式:

    {{1}}

    它可以正常工作并且按预期运行,但是要确保首先没有更好的方法(在数据库端或触发器中)。

1 个答案:

答案 0 :(得分:1)

我认为最好将active更改为(持久的)计算列,并使用此定义:

CASE WHEN inactive IS NULL THEN 0 ELSE 1 END

然后你根本不需要任何触发器,你可以设置inactive = GETDATE()来完成目的。

尽管如此,当前编写触发器的方式(在两个版本中),inactive列将更新为当前日期,即使我运行这样的查询:

UPDATE tblRegistration
SET active = 0
WHERE active = 0

如果您只希望更新日期如果字段从1更改为0,那么触发器中的更新语句需要是:

UPDATE tblRegistration
SET inactive = GETDATE()
FROM inserted i
INNER JOIN deleted d ON i.id = d.id
WHERE tblRegistration.id = i.id AND i.active = 0 AND d.active = 1