child table 更新后 parent table 上的数据库触发器更新行
Database trigger to update a row on parent table after child table has been updated
第一次创建数据库触发器。我有一个 child table,当它的成本列更新时,我需要它的 parent table 也更新它的成本列以反映变化。
这是我到目前为止的遗憾尝试。这显然是行不通的。我在弄清楚如何将总成本提取为变量并将其存储在 parent table 中时遇到问题。
我当前的方法目前采用静态 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'.
试试这个
Update parenttable set total= (select sum(total) from childtable c where c.id= parent table.id)
Where id in (select id from inserted)
更改 table 和列名。
您需要小心触发器,因为可能会更新不止一行。因此,您需要进行基于行的处理。
要获取新插入/更新的行,请使用inserted
和deleted
伪行。
您几乎肯定还需要实施 deleted
触发器,即,如果从子项中删除了一行 table,则父项将需要重新计算。
这是基于行的拍摄,使用 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
第一次创建数据库触发器。我有一个 child table,当它的成本列更新时,我需要它的 parent table 也更新它的成本列以反映变化。
这是我到目前为止的遗憾尝试。这显然是行不通的。我在弄清楚如何将总成本提取为变量并将其存储在 parent table 中时遇到问题。
我当前的方法目前采用静态 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'.
试试这个
Update parenttable set total= (select sum(total) from childtable c where c.id= parent table.id)
Where id in (select id from inserted)
更改 table 和列名。
您需要小心触发器,因为可能会更新不止一行。因此,您需要进行基于行的处理。
要获取新插入/更新的行,请使用inserted
和deleted
伪行。
您几乎肯定还需要实施 deleted
触发器,即,如果从子项中删除了一行 table,则父项将需要重新计算。
这是基于行的拍摄,使用 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