SQL Триггер сервера для обновления одного значения в таблице после вставки в другую таблицу, если критерии выполнены - PullRequest
0 голосов
/ 04 марта 2020

Обновление: просто чтобы исключить одно возможное предложение, я сохранил первый запрос как представление и подставил его в триггер. Никаких изменений в поведении не наблюдалось. Я обновил код ниже, чтобы отразить новое расположение.

Я только начал работать с SQL Триггерами сервера и добился определенного успеха. Текущий бит, над которым я работаю, сбивает меня с толку.

Я работаю с двумя таблицами. Один из них является заголовком заказа, а другой содержит позиции. Триггер отслеживает вставку новой строки в таблицу элементов строки и, если добавленный элемент соответствует определенным критериям, обновляет значение в таблице заголовка заказа. Когда я разбиваю свой запрос и запускаю его отдельно, я получаю то, что ожидаю. Список заказов, которые содержат элементы, за которыми я слежу.

--QUERY WORKS AS EXPECTED
SELECT ord_no, cmt_cd_1 
FROM OrderHeader
WHERE ord_no IN
    (SELECT DISTINCT OrderHeader.ord_no
    FROM OrderLine INNER JOIN OrderHeader 
    ON OrderLine.ord_no = OrderHeader.ord_no
    WHERE (OrderLine.item_no LIKE 'A%') OR
          (OrderLine.item_no LIKE 'B%') OR
          (OrderLine.item_no LIKE 'C30%'))

Однако, когда я пытаюсь использовать это в триггере, он не работает.

--TRIGGER DOES NOT UPDATE ANY RECORDS
CREATE TRIGGER add_cmt_cd
ON [OrderLine]
AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON;

    UPDATE OrderHeader
    SET cmt_cd_1 = 'O'
    FROM OrderHeader 
    INNER JOIN inserted ON OrderHeader.ord_no = inserted.ord_no
    WHERE (OrderHeader.ord_no IN (SELECT OrderListView.ord_no
                                  FROM OrderListView))
END

I проверили, что запись заголовка создается первой и существует до создания записей позиции. У меня есть другой триггер в этой таблице, который работает нормально, хотя значение, которое он обновляет, находится в той же таблице, что и триггер.

--TRIGGER WORKS AS DESIGNED
CREATE TRIGGER add_line_cmt
ON [OrderLine]
AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON;

    UPDATE OrderLine
    SET cmt_1 = 'Comment 1',
        cmt_2 = 'Comment 2'
    FROM OrderLine 
    INNER JOIN inserted ON inserted.ord_no = OrderLine.ord_no
    WHERE (OrderLine.item_no IN (SELECT CAST(item_no AS CHAR) AS item
                                 FROM ItemTable
                                 WHERE (group = 3)))
END

Я бьюсь головой об стол в течение 3 часов, и я знаю, это что-то простое, что я пропустил. Я надеюсь, что некоторые другие наборы глаз заметят это, прежде чем я go орехи.

...