-
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