这就是我所拥有的。它看起来像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
任何帮助将不胜感激。
答案 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