你能帮我解决一下我的更新触发器吗?它看起来应该有效

时间:2012-03-22 20:41:00

标签: sql sql-server-2005 triggers

这就是我所拥有的。它看起来像MS的例子,我无法弄清楚为什么它没有运行。我在此行中收到Invaild列名称'PlanID'错误:

WHERE gm.PlanId = i.[PlandID]

我的印象是INSERTED将包含与Plan表相同的字段。也许我离开了 - 这是我的第一个触发器!

PlanID是Plan表中的主键,是Measures的外键。我基本上希望检查Plan的Status字段中的行何时更新,然后更新Measures中的Status字段。

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 个答案:

答案 0 :(得分:3)

为什么使用旧样式joins

您根本不需要删除的表格。

这应该对你有用

 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 :(得分:1)

你错过拼写的PlanID作为PlandID。

答案 2 :(得分:1)

首先,您需要使用正确的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