Можете ли вы дать мне руку с моим триггером обновления?Похоже, это должно работать - PullRequest
1 голос
/ 23 марта 2012

Это то, что у меня есть. Это похоже на пример MS, и я не могу понять, почему он не работает. Я получаю сообщение об ошибке «PlanID» в столбце Invaild в этой строке:

WHERE gm.PlanId = i.[PlandID]

У меня сложилось впечатление, что INSERTED будет содержать те же поля, что и таблица плана. Может быть, я далеко - это мой первый триггер!

PlanID является первичным ключом в таблице плана и внешним ключом для показателей. Я просто хочу проверить, когда обновляется строка в поле «Статус» плана, а затем обновить поле «Состояние» в «Показателях».

CREATE TRIGGER utr_Plan_Cascade_Status
   ON  [dbo].[Plan]
   for UPDATE
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    IF(UPDATE([Status]))
    BEGIN
        UPDATE dbo.Measures
            SET [Status]= i.[Status]
        FROM dbo.Measures m, INSERTED i, DELETED d
            WHERE m.PlanId = i.[PlandID]

    END

END

Любая помощь будет оценена.

Ответы [ 3 ]

3 голосов
/ 23 марта 2012

Почему вы используете старый стиль объединения ?

Вам также не нужна удаленная таблица вообще.

Это должно работать для вас

 UPDATE m
            SET m.[Status]= i.[Status]
        FROM dbo.Measures m
        JOIN INSERTED i ON m.PlanId = i.[PlandID]

Так же, как FYI .. IF(UPDATE([Status])) сработает, если вы выполните следующее

Update Table set Status = Status

, возможно, вы хотите добавитьwhere m.Status <> i.Status к вашему предложению WHERE

Также имейте в виду, что если этот столбец обнуляем, вы должны учитывать это в этом предложении where

1 голос
/ 23 марта 2012

сначала вам нужно использовать правильный синтаксис JOIN, и у вас было слово с ошибкой

CREATE TRIGGER utr_Plan_Cascade_Status
   ON  [dbo].[Plan]
   for UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    IF(UPDATE([Status]))
    BEGIN
        UPDATE m
            SET m.[Status]= i.[Status]
        FROM dbo.Measures m
        INNER JOIN INSERTED i
            WHERE m.PlanId = i.[PlanID]

    END

END
1 голос
/ 23 марта 2012

Вы пропустите записанный PlanID как PlandID.

...