Tsql 更新触发更好的方法

Tsql 更新触发更好的方法,tsql,triggers,sql-server-2008-r2,Tsql,Triggers,Sql Server 2008 R2,我有一个我正在开发的触发器,希望它基本上能够处理Update语句意义上的更新,而不是像现在这样担心Delete或Insert语句 最终的结果是,我有两个状态字段active和inactive,分别是bit和datetime。active字段用于暂时手动使记录无效,我希望确保inactive字段包含activechange的值 理想情况下,我希望检查active=0,并使用now()在记录字段中放置日期时间戳。长期来看,我确信我会想验证非活动的字段是否已经没有日期时间戳,但现在覆盖它还可以。此外,

我有一个我正在开发的触发器,希望它基本上能够处理
Update
语句意义上的更新,而不是像现在这样担心
Delete
Insert
语句

最终的结果是,我有两个状态字段
active
inactive
,分别是
bit
datetime
active
字段用于暂时手动使记录无效,我希望确保
inactive
字段包含
active
change的值

理想情况下,我希望检查
active=0
,并使用
now()
在记录字段中放置日期时间戳。长期来看,我确信我会想验证
非活动的
字段是否已经没有日期时间戳,但现在覆盖它还可以。此外,希望让它检查
active=1
,如果存在任何值,则清除
inactive
字段

inactive
字段为
null
,因此不会发生冲突

触发器定义,截至目前: 我对插入的
和删除的
触发器表有很好的理解

问题:
  • 触发器中是否有更好的逻辑模式可以让我达到最终的期望目标
  • 如果他们提交了一个
    inactive
    值,且
    active=0
    active=1
    ,需要考虑哪些因素
  • 触发器的当前形式:
    它可以正常工作,但首先要确保没有更好的方法(在数据库端或触发器中)。

    我认为最好将
    活动的
    更改为(持久化的)计算列,定义如下:

    CASE WHEN inactive IS NULL THEN 0 ELSE 1 END 如果只希望在字段从1更改为0时更新日期,则触发器中的update语句需要为:

    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 更新TBL注册 设置为不活动=GETDATE() 从插入i i.id=d.id上的内部联接已删除d 其中tblRegistration.id=i.id,i.active=0,d.active=1
    您也可以只使用非活动标志。与其更新active=0,不如更新inactive=now()。这样就可以完全取消触发器和活动标志。不确定这是否是你的选择。我个人不太喜欢触发器。。。。我尽可能避免使用它们。@samyi我不打算更改
    active
    的值,而只是更改
    inactive
    的值。我这样做只是因为我正在开发的产品需要支持当地IT部门。我使用触发器是为了防止它的翻滚,为什么要基于DateTime字段进行计算?该表可能有100000个记录条目,其中可能有0.5%被积极管理。对1位字段和8字节字段进行验证不是更好吗?对我来说,[inactive]字段是一个非条目,从逻辑上讲,这比我给开发人员的值少了一个值;)您可以将该列设置为持久化,并且它的行为(性能方面)与标准列完全相同。它还保证了数据的完整性,并迫使开发人员养成良好习惯-设置
    非活动日期将行标记为非活动,清除该日期将行标记为活动。您仍然只有1个值要更新,并且它避免了使用触发器(速度较慢)。
    CASE WHEN inactive IS NULL THEN 0 ELSE 1 END
    UPDATE tblRegistration
    SET active = 0
    WHERE active = 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