2

テーブルT1とT2があるとします

Columns of T1 -->Value
Columns of T2 -->OldValue NewValue

私が必要としているのは、T1 の更新時に T2 にレコードを挿入するトリガーです。古い値と新しい値も知る必要があります。これまでトリガーを使用したことがありません。このトリガーを作成しています。可能ですか、ありがとうございます。

4

3 に答える 3

6

さて、次のようにトリガーを書き始めます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、前者にはすべての新しい値が含まれ、後者には古い値が含まれていることは容易に推測できます。

これらのテーブルは、トリガーが割り当てられているテーブルと同じ構造を持っていますT1UPDATEこれらには、トリガーを呼び出した特定のステートメントによって影響を受けた行のみが含まれます。つまり、複数の行がある可能性があります。つまり、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 でスクリプトを実行している場合は、ステートメントの終わりを示すために区切り文字を配置できます)。

役に立つ読み物:

于 2012-05-18T08:40:25.323 に答える
2

私はあなたのためにすべてを構築するつもりはありません (面白くありませんよね?) が、私はあなたを正しい方向に向けることができます.

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 で同じ値になります。

于 2012-05-18T08:49:42.503 に答える
1
create trigger T_UPD_T1
on T1 FOR  update
as
insert into T2 select deleted.value, inserted.value from inserted, deleted 
于 2012-05-18T08:31:25.553 に答える