0

ここで使用する必要があるものを見つけようとしています:削除、挿入、または更新。

基本的。

メインテーブルが更新され、ステータスが保留中またはアクティブに変化した場合にのみ、履歴テーブルにデータを書き込む必要があります。

これは私が今持っているものです:

ALTER TRIGGER [dbo].[trg_SourceHistory]  ON [dbo].[tblSource]
FOR UPDATE AS  
    DECLARE @statusOldValue char(1) 
    DECLARE @statusNewValue char(1)

    SELECT @statusOldValue = statusCode FROM deleted 
    SELECT @statusNewValue= statusCode FROM updated

    IF (@statusOldValue <> @statusNewValue) AND 
       (@statusOldValue = 'P' or @statusOldValue = 'A')
    BEGIN TRY
       INSERT * INTO tblHistoryTable)  
           select * from [DELETED]

だから私は新しいデータをメインテーブルに残し、履歴テーブルを上書きされたもので更新したい...今は同じ情報をコピーするだけです。したがって、更新後、両方のテーブルに同じデータがあります。

4

3 に答える 3

7

InsertedDeleted疑似テーブルのみがあり、 はありませんUpdated

の場合、UPDATE(Inserted更新後の) 新しい値が含まDeletedれ、更新前の古い値が含まれます。

また、トリガーは行ごとに 1 回ではなく、バッチごとに 1 回起動されることに注意してください。したがって、両方の疑似テーブルに複数の行が含まれる可能性があります。単一の行を想定してこれを変数に代入しないでください-これ

SELECT @statusOldValue = statusCode FROM deleted 
SELECT @statusNewValue= statusCode FROM updated

複数の行がある場合は失敗します。および!の複数の行で動作するような方法でトリガーを記述する必要があります。InsertedDeleted

更新:はい-これを書くためのはるかに良い方法があります:

ALTER TRIGGER [dbo].[trg_SourceHistory]  ON [dbo].[tblSource]
FOR UPDATE 
AS  
   INSERT INTO dbo.tblHistoryTable(Col1, Col2, Col3, ...., ColN)
      SELECT Col1, COl2, Col3, ..... ColN
        FROM Deleted d
        INNER JOIN Inserted i ON i.PrimaryKey = d.PrimaryKey
        WHERE i.statusCode <> d.statusCode
          AND d.statusCode IN ('A', 'P')

基本的:

  • 挿入する列を明示的に指定します-ステートメントと挿入するデータを取得するINSERTステートメントの両方でSELECT-厄介な驚きを避けるために

  • INNER JOINbetweenInsertedDeleted疑似テーブルを作成して、更新されたすべての行を取得します

  • WHEREの節で他のすべての条件 (異なるステータス コードなど) を指定します。SELECT

このソリューションは、更新される行のバッチに対して機能します。複数行の更新では失敗しません....

于 2011-07-25T18:30:11.427 に答える
5

次のレコードをチェックするには、insertedとテーブルの両方を 一緒に使用する必要があり ます 。deleted


また、marc_sの回答によると、トリガーは単一のレコードプロセスではありません。

INSERT INTO
  tblHistoryTable
SELECT
  deleted.*
FROM
  inserted
INNER JOIN
  deleted
    ON inserted.PrimaryKey = deleted.PrimaryKey
WHERE
  inserted.StatusCode <> deleted.StatusCode
  AND (inserted.StatusCode = 'P' OR inserted.StatusCode = 'A')
  • 挿入 = 新しい値
  • 削除済み = 古い値
于 2011-07-25T18:47:39.983 に答える
1

テーブルがありません。updatedお探しのinserted.

于 2011-07-25T18:29:58.197 に答える