0

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

最终结果是我有两个状态字段active& inactive,它们分别是bit& datetime。该active字段用于手动使记录无效,并且我想确保该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. 如果他们使用, 或提交inactive值,需要考虑什么?active=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

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

4

1 回答 1

1

我认为最好active使用以下定义更改为(持久的)计算列:

CASE WHEN 不活动为 NULL THEN 0 ELSE 1 END

那么你根本不需要任何触发器,你只需设置inactive = GETDATE()即可完成目的。

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

更新 tblRegistration
设置激活 = 0
活跃的地方 = 0

如果您只想在字段从 1 更改为 0 时更新日期,则触发器中的更新语句需要是:

更新 tblRegistration
SET 无效 = GETDATE()
FROM 插入我
INNER JOIN 已删除 d ON i.id = d.id
WHERE tblRegistration.id = i.id AND i.active = 0 AND d.active = 1
于 2013-03-18T02:17:51.503 回答