2011-02-03 5 views
14

おそらくばかげた質問!挿入トリガーの後にストアドプロシージャを呼び出す

私がAfter Insertトリガー(T-SQL)からストアドプロシージャを呼び出す場合、 "just inserted"データの値を取得するにはどうすればよいですか?例:

CREATE TRIGGER dbo.MyTrigger 
    ON dbo.MyTable 
    AFTER INSERT 
    AS 
    BEGIN 

     EXEC createAuditSproc 'I NEED VALUES HERE!' 

私が心配する任意のID列を持っていない - 私はちょうど私のSPROCに渡すために「ちょうど挿入」の値の一部を使用します。

編集:明確にするために、私はsprocを呼び出すためにこれを必要とし、sprocは複数のことを行うので、テーブルに直接挿入しないでください。私は現在、適切に(時間/リソース/レガシーコード)を行うために修正することができないいくつかの従来のテーブルを使っているので、私が持っているものと作業しなければならない:(

答えて

22

あなたは、 INSERTED and DELETED疑似テーブルを使用してのデータを変更:

例テーブル

create table myTable 
(
    ID INT identity(1,1), 
    Name varchar(10) 
) 
GO 

create table myTableAudit 
(
    ID INT, 
    Name varchar(10), 
    TimeChanged datetime default CURRENT_TIMESTAMP 
) 
GO 

編集考える

CREATE TRIGGER dbo.MyTrigger  
    ON dbo.MyTable  
    AFTER INSERT  
AS  
    BEGIN   
     INSERT INTO myTableAudit(ID, Name) 
     SELECT i.ID, i.Name 
      FROM inserted i; 
    END 

:謝罪は、私は、ストアドプロシージャを呼び出すことについて少し対応していませんでしたあたりとして。 marc_sのコメントです。挿入された/ de 1行に複数の行を入れることができ、SPROCで問題を複雑にします。個人的には、トリガーをSPROCのカプセル化なしで監査テーブルに直接挿入したままにします。

CREATE TYPE MyTableType AS TABLE 
(
    ID INT, 
    Name varchar(10) 
); 
GO 

CREATE PROC dbo.MyAuditProc @MyTableTypeTVP MyTableType READONLY 
AS 
    BEGIN 
     SET NOCOUNT ON; 

     INSERT INTO myTableAudit(ID, Name) 
     SELECT mtt.ID, mtt.Name 
      FROM @MyTableTypeTVP mtt; 
    END 
GO 

そしてあなたのトリガーがそうなどに変更されます:

ALTER TRIGGER dbo.MyTrigger 
    ON dbo.MyTable  
    AFTER INSERT  
AS  
    BEGIN   
     SET NOCOUNT ON; 

     DECLARE @MyTableTypeTVP AS MyTableType; 

     INSERT INTO @MyTableTypeTVP(ID, Name) 
     SELECT i.ID, i.Name 
      FROM inserted i; 

     EXEC dbo.MyAuditProc @MyTableTypeTVP; 
    END 

あなたは、これは動作することをテストすることができますが、SQL 2008を持っている場合しかし、あなたはそうのようなテーブル値パラメータを、使用することができます単一および複数の挿入

insert into dbo.MyTable values ('single'); 

insert into dbo.MyTable 
    select 'double' 
union 
    select 'insert'; 

あなたはSQL 2005以下を使用している場合は、あなたはおそらく、あなたのSPROCに挿入渡した行をループにカーソルを使用する必要があり、あまりにもhorr何かの両方のために熟考することができる。サイドノートとして

あなたはSQL 2008を持っている場合、あなたはChange Data Capture

編集#2に見えるかもしれません:あなたは、PROCを呼び出す必要があるので、あなたはあなただけの1行を挿入することを確信している場合。 ..

ALTER TRIGGER dbo.MyTrigger 
    ON dbo.MyTable  
    AFTER INSERT  
AS  
    BEGIN   
     SET NOCOUNT ON; 

     DECLARE @SomeInt INT; 
     DECLARE @SomeName VARCHAR(10); 

     SELECT TOP 1 @SomeInt = i.ID, @SomeName = i.Name 
     FROM INSERTED i; 

     EXEC dbo.MyAuditProc @SomeInt, @SomeName; 
    END; 
+4

+1また、それらの 'Inserted'テーブルと' Deleted'テーブルには潜在的にいくつかの行が含まれていることに注意してください。トリガーでただ1つの行が処理されているとは決して考えないでください! –

+0

これらの値をストアドプロシージャのパラメータとして取得するにはどうすればよいですか?それらをすべて宣言してから 'select @ param1 = val1、@ param2 = val2'を入力してそれらを渡す必要がありますか? – BlueChippy

+0

@ param1 = val1は1つの方法ですが、複数の行を扱うことができるので、テーブル引数を実装するかカーソルを使用して挿入されたデータ行ごとにストアドプロシージャを1回呼び出すことをおすすめします。 – Armand

関連する問題