我正在开发一个触发器,希望它基本上处理Update
语句意义上的更新,而不是那时担心Delete
或Insert
语句。 / p>
最终结果是我有两个状态字段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
触发表。
inactive
或active=0
或active=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
值,则需要考虑哪些事项?{{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