テーブルT1とT2があるとします
Columns of T1 -->Value
Columns of T2 -->OldValue NewValue
私が必要としているのは、T1 の更新時に T2 にレコードを挿入するトリガーです。古い値と新しい値も知る必要があります。これまでトリガーを使用したことがありません。このトリガーを作成しています。可能ですか、ありがとうございます。
テーブルT1とT2があるとします
Columns of T1 -->Value
Columns of T2 -->OldValue NewValue
私が必要としているのは、T1 の更新時に T2 にレコードを挿入するトリガーです。古い値と新しい値も知る必要があります。これまでトリガーを使用したことがありません。このトリガーを作成しています。可能ですか、ありがとうございます。
さて、次のようにトリガーを書き始めますCREATE TRIGGER
。
CREATE TRIGGER NameOfTheTriggerPlease
…
追加のアクションをトリガーする必要があるテーブルは、トリガーをそのテーブルT1
に定義する必要があるためです。ON
CREATE TRIGGER T1OnUpdate /* that's just an example,
you can use a different name */
ON T1
…
トリガーが呼び出されるアクションは でUPDATE
あり、タイミングはAFTER
更新であるため、…</p>
CREATE TRIGGER T1OnUpdate
ON T1
AFTER UPDATE
…
ここで、トリガーの本体、つまりトリガーによって実際に実行されるステートメントを紹介します。本文は、AS
キーワードの後にステートメント自体を続けて導入します。
あなたの場合、INSERT
明らかなステートメントは 1 つだけです。それほど明白ではないのは、古い値と新しい値にアクセスする方法です。現在、SQL Server は と の 2 つの仮想テーブルを提供してINSERTED
おりDELETED
、前者にはすべての新しい値が含まれ、後者には古い値が含まれていることは容易に推測できます。
これらのテーブルは、トリガーが割り当てられているテーブルと同じ構造を持っていますT1
。UPDATE
これらには、トリガーを呼び出した特定のステートメントによって影響を受けた行のみが含まれます。つまり、複数の行がある可能性があります。つまり、T1
削除された行と挿入された行を照合するためにトリガーで使用できる主キーまたは一意の列 (または列のセット) がテーブルに必要です。(実際には、T2
テーブルにT1
の主キーを参照する列が必要になる場合もあります。これにより、 のどの行にT1
どの値が格納されているかを後で確認できますT2
。)
この回答では、 という名前の主キー列PK
と、同じ名前の外部キー列があると仮定しT2
ます。そして、INSERT
ステートメントは次のようになります。
CREATE TRIGGER T1OnUpdate
ON T1
AFTER UPDATE
AS
INSERT INTO T2 (PK, OldValue, NewValue)
SELECT i.PK, i.Value, d.Value
FROM INSERTED i INNER JOIN DELETED d ON i.PK = d.PK
最後に (しかし重要なことですが) 覚えておくCREATE TRIGGER
べきこと: ステートメント全体がバッチ内の唯一のものであるべきです。つまり、CREATE TRIGGER
キーワードの前にステートメントがあってはなりません (ただし、そこにコメントを入れることはできます)。同様に、AS
キーワードの後のすべてが考慮されます。トリガーの本体の一部 (ただしGO
、たとえば SQL Server Management Studio でスクリプトを実行している場合は、ステートメントの終わりを示すために区切り文字を配置できます)。
役に立つ読み物:
私はあなたのためにすべてを構築するつもりはありません (面白くありませんよね?) が、私はあなたを正しい方向に向けることができます.
create trigger logUpdate
on T1
After update
as
begin
insert into T2...
--here is just an example
select * from deleted --the DELETED table contains the OLD values
select * from inserted --the INSERTED table contains the NEW values
end
DELETED と INSERTED は古い値と新しい値を含む内部テーブルであることを思い出してください。更新トリガーでは、両方が存在します。挿入トリガーでは、削除されるものがないため、DELETED は null になります。削除トリガーの同じロジック、INSERTED は空になります
編集:
あなたの質問に答える: 更新するフィールドの数に関係なく、DELETED および INSERTED テーブルには、影響を受けるすべての行のすべての列があります。もちろん、1 つの列だけを更新すると、他のすべての列は DELETED と INSERTED で同じ値になります。
create trigger T_UPD_T1
on T1 FOR update
as
insert into T2 select deleted.value, inserted.value from inserted, deleted