MS SQL 2005 ПОСЛЕ ОБНОВЛЕНИЯ триггер обновляет строку, отличную от обновленной - PullRequest
0 голосов
/ 18 октября 2010

Как пользователь с небольшим опытом или без него, я должен создать триггер на столе (или найти другое решение). Для этого необходимо, чтобы при изменении значения столбца 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

После нескольких часов поиска в Google и еще не выяснил, почему строка не обновляется до «0». У меня есть подозрение, что UPDATE в триггере AFTER UPDATE является причиной, по которой он не работает. У кого-нибудь есть намеки или лучше решение?

Приветствия

Peter

Ответы [ 2 ]

1 голос
/ 18 октября 2010

Оба эти подхода не будут работать при работе с несколькими обновлениями.

Почему вам даже нужно делать это в каждом конкретном случае.Разве вы не можете просто запустить обновление через таблицу?

Может быть, что-то вроде:

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.Если это так, то он запускает оператор обновления, чтобы установить AnotherColumn в ноль, где значение ESB равно 1

Я думаю, что это должно работать для вас

0 голосов
/ 19 октября 2010

Благодаря помощи Барри, если доработан триггер;

    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
...