首次创建数据库触发器。我有一个子表,当其成本列更新时,我需要其父表也更新其成本列以反映更改。
到目前为止,这是我的抱歉尝试。这显然不起作用。我在确定如何将总成本作为变量提取并将其存储在父表中时遇到问题。
我目前的做法是假设一个静态的id vaule。我不完全确定如何动态确定已更新行的id值。
CREATE TRIGGER ParentCost_Update
ON ChildTable
AFTER INSERT, UPDATE
AS
SELECT SUM(Cost) AS TotalCost FROM ChildTable where parent_id=2080
UPDATE ParentTable
SET Cost=TotalCost
where id=parent_id;
GO
此当前脚本返回错误
消息207,级别16,状态1,过程ParentCost_Update,第9行 列名称无效' TotalCost'。
答案 0 :(得分:2)
试试这个
Update parenttable set total= (select sum(total) from childtable c where c.id= parent table.id)
Where id in (select id from inserted)
更改表名和列名。
答案 1 :(得分:2)
您需要小心触发器,因为可能会更新多行。因此,您需要进行基于行的处理。
要获取新插入/更新的行,请使用inserted
和deleted
伪行。
您几乎肯定也需要实现一个deleted
触发器,即,如果从子表中删除了父表将需要重新计算的行。
这是一个基于行的拍摄,使用CTE映射上面的两步过程,如下所示:
CREATE TRIGGER ParentCost_Update
ON ChildTable
AFTER INSERT, UPDATE, DELETE
AS
SET NOCOUNT ON;
WITH cteParentsAffected AS
(
SELECT ins.parent_id
FROM inserted ins
UNION
SELECT del.parent_id
FROM deleted del
)
, cteTotal AS
(
SELECT ct.parent_id, SUM(ct.Cost) AS TotalCost
FROM ChildTable ct
INNER JOIN cteParentsAffected par
ON ct.parent_id = par.parent_id
GROUP BY ct.parent_id
)
UPDATE pt
SET Cost=cte.TotalCost
FROM ParentTable pt
INNER JOIN cteTotal cte
ON id=cte.parent_id;
GO