あなたは、 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;
+1また、それらの 'Inserted'テーブルと' Deleted'テーブルには潜在的にいくつかの行が含まれていることに注意してください。トリガーでただ1つの行が処理されているとは決して考えないでください! –
これらの値をストアドプロシージャのパラメータとして取得するにはどうすればよいですか?それらをすべて宣言してから 'select @ param1 = val1、@ param2 = val2'を入力してそれらを渡す必要がありますか? – BlueChippy
@ param1 = val1は1つの方法ですが、複数の行を扱うことができるので、テーブル引数を実装するかカーソルを使用して挿入されたデータ行ごとにストアドプロシージャを1回呼び出すことをおすすめします。 – Armand