【发布时间】:2010-10-19 16:11:20
【问题描述】:
作为一个经验很少或没有经验的用户,我必须在表上创建触发器(或寻找其他解决方案)。需要完成的是,当表中另一行的 ESB 列的值更改为“1”时,该列必须设置为“0”。
我的意图是使用 AFTER UPDATE 触发器来执行此操作。
ALTER TRIGGER [TR_PHOTO_UPD]
ON [SOA].[dbo].[photos_TEST]
AFTER UPDATE
AS
DECLARE @ID VARCHAR(10)
DECLARE @ESB VARCHAR(1)
SELECT @ID = (SELECT TOP(1) ID
FROM SOA.dbo.photos_TEST
WHERE esb = 'Q'
ORDER BY ARRIVALDATETIME ASC)
SELECT @ESB (SELECT esb FROM INSERTED)
IF @ESB = '1'
UPDATE SOA.dbo.photos_TEST SET esb = '0' WHERE ID = @I
你可能明白,这行不通,下一个触发器定义也行不通。
ALTER TRIGGER [TR_PHOTO_UPD]
ON [SOA].[dbo].[photos_TEST]
AFTER UPDATE
AS
DECLARE @ID VARCHAR(10)
DECLARE @ESB VARCHAR(1)
SELECT @ID = (SELECT TOP(1) ID
FROM SOA.dbo.photos_TEST
WHERE esb = 'Q'
ORDER BY ARRIVALDATETIME ASC)
SELECT @ESB (SELECT esb FROM INSERTED)
IF @ESB = '1'
BEGIN
UPDATE SOA.dbo.photos_TEST
SET esb = '0'
WHERE id = (SELECT TOP(1) ID
FROM SOA.dbo.photos_TEST
WHERE esb = 'Q'
ORDER BY ARRIVALDATETIME ASC)
END
经过几个小时的谷歌搜索和尝试,我还没有发现为什么该行没有更新为“0”。我怀疑 AFTER UPDATE 触发器中的 UPDATE 是它不起作用的原因。有人有任何提示或更好的解决方案吗?
干杯,
彼得
【问题讨论】:
-
看起来您希望在将值 1 插入 ESB 列时更新具有最近添加的 ID 的行,对吗?
-
是的,完全正确。如果添加一行,则 ESB 的值为“Q”。触发器应将一行的值设置为“0”。在此之后,数据库适配器处理数据并将值从 0->R(eserved)->1(processed) 更改。如果存在 ESB='Q' 的行,则必须将一行(到达日期最早的)设置为 0 以启动处理。