2017-04-06 9 views
0

私はこの問題で達成したいのは、自分のテーブルの1つに更新/削除/挿入を行った場合、そのレコードをログ目的のテーブルの1つに挿入することです。トリガーで実行されるアクションを取得する方法

私はテストとして1つのテーブルを持っています。私は私のテーブルのテストで以下の行を挿入した場合、それはトリガーを起動し、ログ

テスト

Id | Name | Location   
1 | Test | America 

ログ

ID | updatetime    | Action  
----------------------------------------------------------  
1 | 2017-04-06 16:51:18.190 | Insert 
である私の別のテーブルに行を挿入する必要がありますと仮定

同じものを削除したり更新したりすると、それぞれ削除または更新する必要があります

ID | updatetime    | Action  
----------------------------------------------------------  
1 | 2017-04-06 16:51:18.190 | Insert 
1 | 2017-04-06 16:51:18.190 | Delete 

は、私は上記のトリガーから

create trigger abc 
on test 
after insert, update, delete 
as 
begin 
    declare @id int 

    select @id = i.id from inserted i 

    insert into log values (@id, GETDATE()) 
end 

を単一のトリガを作成している私は、IDとupdatetimeを取得することができています、しかし、どのようにそれを達成するためにどのように行われていたものを、アクションのようなアクション列を取得します。誰もがあなたが起きているアクションを決定するための次のアプローチを作成することができます手掛かり

+0

あなたのトリガーがあなたはそれが呼び出されることになりますと仮定しているように見えるという点で、** MAJOR **欠陥を持っているの** 1行につき1回** - そうではありません**。トリガは**文ごとに** **起動します。したがって、文が25行に影響する場合、トリガは**一度**発生しますが、Insertedおよび/または 'Deleted'疑似テーブルにはそれぞれ25行。あなたのコードがここで選択する25行のうちどれですか? 'SELECT @id = i.id FROM Inserted i' - 非決定論的です。これを考慮に入れてトリガーを書き直す必要があります。 –

答えて

2

持つことができます -

DECLARE @Action as char(1); 
    SET @Action = (CASE WHEN EXISTS(SELECT * FROM INSERTED) 
         AND EXISTS(SELECT * FROM DELETED) 
         THEN 'U' -- Set Action to Updated. 
         WHEN EXISTS(SELECT * FROM INSERTED) 
         THEN 'I' -- Set Action to Insert. 
         WHEN EXISTS(SELECT * FROM DELETED) 
         THEN 'D' -- Set Action to Deleted. 
        END) 

-- For Getting the ID 
if @Action = 'D' 
select @id=i.id from DELETED i 
else -- Insert or Update 
select @id=i.id from INSERTED i 
+0

こんにちはAhmedあなたのコードは優れていますが、私はログテーブルのエントリが作成されているが、NULLを表示しているIDの列にテストテーブルの削除クエリを実行しているときに1つの問題がある –

+0

@ Rededevil、 'の代わりに' deleted'を選択してください。 –

+0

しかし、私が挿入または更新しようとすると、NULLが来るようになります。 –

関連する問題