2016-11-17 13 views
0

私は、挿入/更新操作を追跡するためにAuditテーブルを取得しました。 私の問題は、更新時に2つのケースがあることです。 1)定期アップデート 2)Isdeletedというフィールドをfalseからtrueに更新します。mssqlトリガー - INSERTEDテーブルから特定のデータを選択する

私は両方のケースを分離しようとしましたが、私は何かが紛失しています。私はトリガーに新しいです。私は何をしたいか

DECLARE @Action AS CHAR(1) 
DECLARE @Count AS INT 


SET @Action = 'I' 
SELECT @Count = COUNT(*) FROM DELETED 
if @Count > 0 
    BEGIN 
     SET @Action = 'D' 
     SELECT @Count = COUNT(*) FROM INSERTED WHERE INSERTED.IsDeleted = 0 
     IF @Count > 0 
      SET @Action = 'U' 
    END 

が変更された値のみがIsDeletedたとき(偽から真の)アクション=「D」を取得することです。 他の値が変更された場合は 'U'。

答えて

1

トリガーの作成方法に応じて、UPDATE()を使用して@Actionの値を設定するロジックを簡素化するようにトリガーを変更できます。例えば

:私はあなたが探しているものだと思うisDeleted列、上の変更がある場合

CREATE TRIGGER myTrigger ON myTable AFTER UPDATE, DELETE 
BEGIN 

    DECLARE @Action AS CHAR(1) 

    IF UPDATE(isDeleted) 
     SET @Action = 'U' 

END 

これは毎回しかし@Actionの唯一SET値を発射します。

これ以降は何をするつもりか分かりませんが、必要なことはできます。

0

この選択は、IsDeleted列が0から1に更新された行数を返します:トリガーが(とは、行ごと)の文ごとに動作するので、しかし

select count(*) 
from inserted inner join deleted on <fk_column(s)> 
where deleted.IsDeleted = 0 
and inserted.IsDeleted = 1 

を、例いくつかがあるかもしれません行は削除され、一部は更新されただけなので、行ごとのアクションを維持するのはちょっと難しいかもしれません。

0

これを試してみてください。


DECLARE @Action AS CHAR(1) 
DECLARE @Count AS INT 

IF NOT EXISTS(SELECT 1 FROM Deleted) 
BEGIN 
    SELECT 
     @Action = 'I' 
END 
ELSE 
BEGIN 

    SELECT 
    @Count = COUNT(1) 
    FROM Inserted Ins 
     INNER JOIN Deleted Del 
     ON Ins.SeqNo = Del.SeqNo 
     WHERE ISNULL(Ins.IsDeleted,0) <> ISNULL(Del.IsDeleted,0) 
      AND Ins.Column1 = Del.Column1 
      AND Ins.Column2 = Del.Column2 
      AND Ins.ColumnN = Del.ColumnN 

    SELECT 
    @Action = CASE WHEN ISNULL(@Count,0)>0 
       THEN 'D' 
       ELSE 'U' END 

END 

SELECT 
    [ActionCode] = @Action 
関連する問題