2013-06-17 3 views
3

У меня есть схема со следующей структурой; enter image description here
В MPRMain таблице, Status может быть 1 (Aprove), 2 (Отмена) и 3 (В ожидании). Я пытаюсь сделать что-то подобное. Например, когда кто-то обновляет Status (в MPRMain) до 2 (Отмена). Я хочу обновить таблицу Status таблицы MPRDetail до 0 (0 для отключения и 1 для включения).
Итак, я попытался создать триггер для него, который выглядит так:SQL Server After Update Trigger Not Working

Alter Trigger Inventory.MprMainUpdate 
    ON Inventory.MPRMain 
    AFTER UPDATE 
AS 
BEGIN 

    declare @status as int; 
    set @status = (SELECT Status FROM inserted); 
    if(@status=2) 
    BEGIN 
     UPDATE Inventory.MPRDetail 
     SET Status = 0 -- update the status to canceled 
     WHERE MPRId = (select MPRId from inserted); 
    END 

END 

Однако, когда я пытаюсь установить Status из MPRMain к 2 (Отмена) От 1 (Aprove), я не вижу каких-либо изменений в MPRDetail таблице. Это должно обновить статус MPRDetail до 0 (0 для отключения).

+1

Ваша первая проблема заключается в том, что вы ** неправомерно ** предполагая, что триггер называется ** один раз в строке ** - это не так. Он называется ** один раз за оператор **, а ваша таблица «Inserted» может (и * будет *!) Содержать несколько строк - так что вы выбираете с помощью 'set @status = (SELECT Status FROM вставлен);' - это **не определен**. Вам нужно переписать триггер, чтобы принять во внимание, что 'Inserted' (и' Deleted') ** будет содержать несколько строк! Вам необходимо обработать те, у которых установленный подход –

+0

@marc_s, любой пример от вас, будет оценен по достоинству. Раньше я не использовал триггеры. –

ответ

2

Поскольку Inserted может содержать несколько строк, то нужно написать триггер с на основе набора подхода:

ALTER TRIGGER Inventory.MprMainUpdate 
    ON Inventory.MPRMain AFTER UPDATE 
AS 
BEGIN 
    UPDATE Inventory.MPRDetail 
    SET Status = 0 
    FROM Inserted i 
    WHERE i.Status = 2 AND Inventory.MPRDetail.MPRId = i.MPRId; 
END 

Поэтому в основном вы должны присоединиться к вашей фактической таблицы данных по таблице Inserted псевдо основе MPRId столбца, и обновить все строки в базовую таблице Status = 0 где Inserted.Status = 2

OK - здесь я иду: если предположить ваше UPDATE обновления заявления четыре строки, й ан Inserted может выглядеть в вашем триггере:

MPRId MprNo Date DepartmentId Status 
    1  42  .. .......  1 
    2  43  .. .......  2 
    7  33  .. .......  7 
    9  41  .. .......  2 

Теперь вы JOIN этот набор данных от вашего MPRDetail таблицы, и вы только выбрать те строки, где Status в Inserted является 2 - так что вы получите

MPRId Status MPRDetail.Status (other columns of MPRDetail for those values) 
    2  2   4   ..................................... 
    9  2   5   ..................................... 

Итак, в этом случае обе строки в MPRDetail будут иметь Status, обновленный до 0 внутри триггера - любые другие строки не будут затронуты.

Это делает вещи более ясными? Если нет: где вы застряли, что еще «магия» и, следовательно, неясно для вас?

+0

следует удалить первые 3 строки, i-e условие if –

+0

@DotNetDreamer: да - потому что эти строки совершенно не нужны, когда вы используете мой триггер - этот код проверяет одно и то же условие –

+0

извините, он отлично работает. Могу ли я получить более подробный ответ или ссылку, которая может мне помочь? –