首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MS SQL 2005更新UPDATE触发器更新其他行而不是已更新行

MS SQL 2005更新UPDATE触发器更新其他行而不是已更新行
EN

Stack Overflow用户
提问于 2010-10-18 21:37:27
回答 2查看 7.4K关注 0票数 0

作为一个几乎没有经验的用户,我必须在一个表上创建一个触发器(或者找到另一个解决方案)。需要完成的是,当表中另一行的ESB列的值更改为“1”时,必须将该列设置为“0”。

我的意图是使用AFTER UPDATE触发器来完成此操作。

代码语言:javascript
运行
复制
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

您可能知道,这是不起作用的,下一个触发器定义也不起作用。

代码语言:javascript
运行
复制
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是它不工作的原因。有没有人有什么建议或者更好的解决方案?

干杯,

彼得

EN

回答 2

Stack Overflow用户

发布于 2010-10-18 21:53:12

在处理多个更新时,这两种方法都不起作用。

为什么你甚至需要在个案的基础上这样做呢?你就不能直接在表上运行一个更新吗?

也许是类似这样的东西:

代码语言:javascript
运行
复制
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

我想这对你应该很管用

票数 1
EN

Stack Overflow用户

发布于 2010-10-19 16:11:20

多亏了巴里的帮助,如果最终敲定了扳机;

代码语言:javascript
运行
复制
    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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3959709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档