【发布时间】:2017-03-24 10:46:26
【问题描述】:
我有一个由外部应用程序更新的表。我有以下列:
- 旧读
- 旧读日期
- 抄表
- 读取日期
- 确认阅读
MeterReading、ReadDate 和 ConfirmReading 由应用程序更新。 ConfirmReading 仅在 MeterReading 超出可接受范围时更新。
我需要以下事情发生:
1) 当 MeterReading 和 ReadDate 在表中更新时,OldReading 和 OldReadDate 应该使用同一个表中的这些值进行更新。
2) 但是,如果 ConfirmReading 也更新了; OldReading 应改为使用此值更新。
3) OldReading 和 OldReadDate 通过上述方式更新后,MeterReading、ConfirmReading 和 ReadDate 应分别设置为 0、0、NULL。
这是我目前所拥有的:
CREATE TRIGGER [dbo].[Set_Old_Streetlight_Readings_to_New] ON [dbo].[M_FRSCHH_STRLGHT_METER]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON
IF UPDATE(MeterReading) AND UPDATE(ConfirmReading)
BEGIN
UPDATE [dbo].[M_FRSCHH_STRLGHT_METER]
SET [OldReading] = [ConfirmReading], [OldReadDate] = [ReadDate]
WHERE ConfirmReading != 0
END
ELSE
IF UPDATE(MeterReading)
BEGIN
UPDATE [dbo].[M_FRSCHH_STRLGHT_METER]
SET OldReading = MeterReading, OldReadDate = ReadDate
WHERE ConfirmReading = 0
END
IF UPDATE(OldReading)
BEGIN
UPDATE [dbo].[M_FRSCHH_STRLGHT_METER]
SET MeterReading = 0, ConfirmReading = 0, ReadDate = NULL, ReadingPhoto = NULL, Reading_Flag = Null
WHERE MeterReading != 0
END
END
当 MeterReading 和 Confirm Reading 都更新时,它有点工作,但如果只有 MeterReading 更新,则不是。
TIA,
杰森
【问题讨论】:
-
我添加了 SQL Server 标签,因为代码看起来像 SQL Server。
-
首先,触发器更新所有行(考虑WHERE),不仅更新行,对吗?
-
接下来,
SET OldReading =... IF UPDATE(OldReading)可能会触发递归,如果在 DB 上允许的话。对吗? -
这是正确的 Serg
标签: sql sql-server triggers sql-update