Конференция "Базы" » Триггер на обновление SQL SERVER [D7, MSSQL]
 
  • yurikon (06.06.13 12:18) [0]
    Доброго дня всем!

    Мне нужно сделать триггер, который заменяет обновляемое поле qty в таблице, на значение qty*k, где k лежит во второй таблице, связь по полю code.

    Table1 - таблица, которая обновляется.

    Делаю так:


    BEGIN
     UPDATE table1 SET QTY = QTY * K FROM
    ( SELECT P.K as K  FROM Inserted I INNER JOIN table1 P ON I.Code = P.Code INNER JOIN table1  L ON L.code = I.code  )
    END



    Эта штука работает, если вручную изменять поле из sql менеджера. Как только в table1 выводятся данные по ODBC из стороннего приложения - сразу выскакивает ошибка 3621 о взаимной блокировке. Как я понимаю и триггер и ODBC источник одновременно пытаются изменить таблицу.

    Помогите грамотно составить триггер.

    С уважением, Юрий.
  • "Добрый Сок" (06.06.13 13:58) [1]
    IF TRIGGER_NESTLEVEL() > 1
        RETURN
  • yurikon (06.06.13 15:34) [2]
    Проблема возникает, когда в обновляемой таблице находится больше 1 элемента с полем CODE. Проверка вложенности триггера не помогает ((.

    Возможно, надо использовать триггер INSTEAD, а не AFTER ?
  • [ВладОшин] © (06.06.13 17:15) [3]
    не внимательно прочитал


    > Возможно, надо использовать триггер INSTEAD, а не AFTER
    > ?

    должно работать и так, если запрос будет правильный

    и не понял,
    >> где k лежит во второй таблице
    а где тут она упоминается?
    UPDATE table1
      SET QTY = QTY * K
    FROM (SELECT
          P.K as K
         FROM
          Inserted I
          JOIN table1 P ON I.Code = P.Code
          JOIN table1 L ON L.code = I.code
    )

  • yurikon (07.06.13 10:48) [4]
    K отбирается в селекте, в котором определяется область обновления для записей.


    UPDATE table1
     SET QTY = QTY * K
    FROM (SELECT
         P.K as K
        FROM
         Inserted I
         JOIN table2_with_k P ON I.Code = P.Code
         JOIN table1 L ON L.code = I.code
    )

  • yurikon (07.06.13 12:28) [5]
    Вопрос закрыт.

    Чтобы избежать взаимных блокировок сделал триггер Instead of.
    Пришлось правда вставлять вставлять записи вручную.


    IF EXISTS(SELECT * FROM inserted) AND NOT EXISTS(SELECT * FROM deleted)
    BEGIN
     INSERT INTO tTable1 SELECT * FROM INSERTED  
    END

    UPDATE tTable1 SET QTY= I.QTY*D.K
    FROM
     (INSERTED I  INNER JOIN tTable1 L ON I.code=L.CODE   LEFT JOIN tDict D ON D.Code = L.code);

    END


 
Конференция "Базы" » Триггер на обновление SQL SERVER [D7, MSSQL]
Есть новые Нет новых   [119624   +36][b:0][p:0.001]