作为一个几乎没有经验的用户,我必须在一个表上创建一个触发器(或者找到另一个解决方案)。需要完成的是,当表中另一行的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是它不工作的原因。有没有人有什么建议或者更好的解决方案?
干杯,
彼得
发布于 2010-10-18 13:53:12
在处理多个更新时,这两种方法都不起作用。
为什么你甚至需要在个案的基础上这样做呢?你就不能直接在表上运行一个更新吗?
也许是类似这样的东西:
If Update(ESB)
begin
Update a
Set AnotherColumn = 0
From YourTable a
Join inserted ins on a.Id = ins.Id
Where ins.ESB = 1
end
这将检查更新的是否是ESB列。如果是,则运行update语句将AnotherColumn
设置为0,其中ESB值为1
我想这对你应该很管用
发布于 2010-10-19 08:11:20
多亏了巴里的帮助,如果最终敲定了扳机;
CREATE TRIGGER TR_PHOTO_AU
ON SOA.dbo.photos
AFTER UPDATE
AS
DECLARE @MAXCONC INT -- Maximum concurrent processes
DECLARE @CONC INT -- Actual concurrent processes
SET @MAXCONC = 1 -- 1 concurrent process
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON
-- If column esb is involved in the update, does not necessarily mean
-- that the column itself is updated
If ( Update(ESB) )
BEGIN
-- If column esb has been changed to 1
IF ((SELECT esb FROM INSERTED) = '1')
BEGIN
-- count the number of (imminent) active processes
SET @CONC = (SELECT COUNT(*)
FROM SOA.dbo.photos pc
WHERE pc.esb in ('0','R'))
-- if maximum has not been reached
IF NOT ( @CONC >= @MAXCONC )
BEGIN
-- set additional rows esb to '0' to match @MAXCONC
UPDATE TOP(@MAXCONC-@CONC) p2
SET p2.esb = '0'
FROM ( SELECT TOP(@MAXCONC-@CONC) p1.esb
FROM SOA.dbo.photos p1
WHERE p1.esb = 'Q'
ORDER BY p1.arrivaldatetime ASC
) p2
END
END
END
https://stackoverflow.com/questions/3959709
复制相似问题