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