2

初めてデータベース トリガーを作成します。コスト列が更新されたときに、変更を反映するために親テーブルもコスト列を更新する必要がある子テーブルがあります。

これまでの私の残念な試みは次のとおりです。それは明らかに機能していません。総コストを変数として抽出し、それを親テーブルに格納する方法を理解するのに問題があります。

私の現在のアプローチでは、現時点では静的 ID 値を想定しています。更新された行の 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' が無効です。

4

2 に答える 2

3

複数の行が更新される可能性があるため、トリガーには注意する必要があります。したがって、行ベースの処理を行う必要があります。

新しく挿入/更新された行を取得するには、insertedおよびdeleted疑似行を使用します。

deleted親を再計算する必要がある行が子テーブルから削除された場合、ほぼ確実にトリガーも実装する必要があります。

次のように、CTE を使用して上記の 2 段階のプロセスをマッピングする行ベースの例を次に示します。

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

ここに SqlFiddle を使用

于 2015-05-12T04:21:05.760 に答える
2

これを試して

 Update parenttable set total= (select sum(total) from childtable c where c.id= parent table.id)
Where id in (select id from inserted)

テーブル名と列名を変更します。

于 2015-05-12T02:53:42.190 に答える