【发布时间】:2009-02-03 11:35:13
【问题描述】:
如果tbl_repair_visit.TENANTSATISFACTION = 'Poor' 更新,我有附加的触发器。
如果我们更改工程师名称,我遇到的问题是,如果 TENANTSATISFACTION = 'Poor' ,工程师列会更新并且触发器会再次运行
如何将其设置为仅在更新 TENANTSATISFACTION = 'Poor' 列并忽略所有其他列的更新时运行
ALTER TRIGGER [dbo].[tr_CustomerSatisfactionAlertRepair]
ON [dbo].[tbl_repair_visit]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
INSERT alertmessagedata (TypeID, Contract, Address, ORDERID,
ENGINEERS, Sent, DateAdded)
SELECT '5', tbl_property.contract, tbl_property.fulladdress,
tbl_repair_visit.orderid, tbl_repair_visit.engineer,
0, GETDATE()
FROM TBL_REPAIR_VISIT
INNER JOIN
INSERTED X ON TBL_REPAIR_VISIT.VISITID = X.VISITID
INNER JOIN
TBL_PROPERTY ON TBL_REPAIR_VISIT.PROPREF = TBL_PROPERTY.PROPREF
WHERE tbl_repair_visit.TENANTSATISFACTION = 'Poor'
END
【问题讨论】:
-
触发器中 BL 不良后果的好例子。
-
既然可以改变它以达到预期的效果,这不是更多的“当实现与设计不匹配时的不良后果”的情况吗?我不明白为什么在这种情况下触发器不好,因为它可以正确编码......
-
@MartGriff:如果之前的值为“差”,则 IF UPDATE(tenantsatisfaction) 将失败,即使租户满意度没有真正改变,它仍会标记已更新。 IF UPDATE 将触发多个 INSERT INTO alertmessagedata。想想用户双击您基于网络的程序上的提交按钮。
-
触发器在 Microsoft SQL 中的存储位置,因为我在 Programmability Database Triggers 文件夹中找不到它们。