web-dev-qa-db-ja.com

SQLServerでトリガーを作成する

SQL Server 2008R2の事前定義された「CREATETRIGGER」を使用してトリガーを作成したいときに迷子になりました。トリガーの作成に使用できる直接SQLステートメントと、AFTER、BEFOREなどを定義する方法を教えてください。

また、行UPDATED/INSERTED/DELETEDを認識し、それらの列値を使用してトリガー内で操作を実行するにはどうすればよいですか?

12
raladin

データベースはセット指向であり、トリガーも同じです。特定の操作が実行されるとトリガーが起動し、その操作が複数の行に影響を与える可能性があります。したがって、質問"Say I want to know the Primary Key of that row"は誤った名称です。複数の行が挿入されている可能性があります。

SQL Serverは、insertedおよびdeletedという名前のAFTERトリガー用に2つの特別なテーブルを提供します。これらは、アクションによって挿入または削除され、影響を受けるテーブルと同じ構造の行を表します。更新トリガーはinserteddeletedの両方にデータを入力する可能性がありますが、挿入トリガーはinsertedテーブルにのみデータを入力します。

コメントから:

ただし、電子メールの受信者は、外部キーIDが最初のテーブル(トリガーのあるテーブル)にある2番目のテーブルの値に基づいて決定されます。

この質問への答えは、insertedテーブル(これも複数の行があると想定する必要があります)を使用して行を循環し、電子メールを送信することです。ただし、電子メールロジックをトリガーに入れることはお勧めしません。代わりに、そのロジックをストアドプロシージャに入れて、そこからメールを送信することをお勧めします。

参考: トリガーの作成

3
Thomas

基本的な構文は次のとおりです。

CREATE TRIGGER YourTriggerName ON dbo.YourTable
FOR|AFTER INSERT, UPDATE, DELETE
AS
BEGIN
     /*Put what ever you want here*/
     UPDATE AnotherTable
          SET SomeColumn = AnotherColumn
     FROM inserted | deleted
END
GO
11
mrdenny

トリガーは、テーブルが何らかの方法で変更された後に「トリガー」されるイベントベースのプロセスです。これは、DELETE、UPDATE、INSERTなどで行われます。 BEFOREおよびAFTER構文は、イベントがコミットされる前または後にトリガーを実行するかどうかを定義します。

それは短いバージョンです。チェックアウト [〜#〜] msdn [〜#〜]

2
user114600