2016-06-13 9 views
0

私は、監査目的のために、ストアドプロシージャのバックオフを実行して特定のデータ変更と挿入をキャプチャするトリガを持っています。 テーブルDTAに行を追加するストアドプロシージャがあります。トリガは、このように起動するようにコーディングされています。挿入トリガーのためのInsert文が機能しません

CREATE TRIGGER [AUDIT_TRACE] 
    ON [DTA] 
    AFTER UPDATE, INSERT 
AS BEGIN 
    SET NOCOUNT ON; 

    BEGIN TRANSACTION 

     IF EXISTS (SELECT * FROM sys.tables WHERE name = 'tmp_inserted') 
      DROP TABLE tmp_inserted 
     IF EXISTS (SELECT * FROM sys.tables WHERE name = 'tmp_deleted') 
      DROP TABLE tmp_deleted 
     SELECT * INTO tmp_inserted from inserted 
     SELECT * INTO tmp_deleted from deleted 

     INSERT INTO [AUDIT_TRAIL] 
     SELECT 
      UpdatedDate 
      ,UserName 
      ,Name 
      ,oldValue 
      ,newValue 
      ,DATATABLEID 
      ,ISNULL(AuthInvNo,'')+ISNULL(invNO,'') as InvoiceNumber 
      ,AuthAccount As Product 
      ,AuthValue AS Value 
      ,QTY 
      ,InputScreen 
     FROM 
     (
      SELECT 
       i.UpdatedDate as [UpdatedDate] 
       ,psn.UserName as [Username] 
       ,CONCAT(psn.Firstname,' ',psn.surname) as [Name] 
       ,CONVERT(nvarchar(36),i.DataTableId) as [DataTableID] 
       ,dtType.Description as [InputScreen] 
       ,dtat.Description as [ColumnName] 
       ,CONVERT(nvarchar(1000),dtText.Text) as [Entry] 
       ,dtavB.Description as OldValue 
       ,dtavA.Description as NewValue 
      FROM dt 
      INNER JOIN inserted i on i.DataTableId = dt.DataTableId 
      LEFT JOIN deleted d on d.DataTableId = i.DataTableId 
      INNER JOIN dtavA on dtavA.DataTableAttributeValueId = i.DataTableAttributeValueId 
           and dtavA.DataTableAttributeTypeId IN ('23087D97-B96B-4015-9E66-258EE7CAF499','2D5E9D64-A2B6-444D-938A-7D8DD66208E0')-- after 
      LEFT JOIN dtavB on dtavB.DataTableAttributeValueId = d.DataTableAttributeValueId 
           and dtavB.DataTableAttributeTypeId IN ('23087D97-B96B-4015-9E66-258EE7CAF499','2D5E9D64-A2B6-444D-938A-7D8DD66208E0')-- before 
      INNER JOIN dtText on dtText.DataTableId = i.DataTableId 
      INNER JOIN dtType on dtType.DataTableTypeId = dt.DataTableTypeID 
      INNER JOIN psn on psn.PersonId = i.UpdatedBy 
      INNER JOIN dtat on dtat.DataTableAttributeTypeId = dtText.DataTableAttributeTypeId 
     )E 
     PIVOT(MAX([ENTRY]) FOR [COLUMNNAME] IN(DEBITCREDIT,AuthValue,QTY,AuthAccount,AuthInvNo,InvNO))as p 
    COMMIT TRANSACTION 
END 

さて問題はOLDVALUE、newValueに、DTAのテーブルにデータを挿入するとき、何も私たちのAUDIT_TRAIL表に挿入されていないが、行がDTAのテーブルに更新された場合、結果は我々が期待して正確に何であるということですすべて。私の同僚と私は質問に間違いがないと言うことができる限り、私たちはプロファイラトレースを使用しており、すべてのセクションが実行されています。コードを手動で実行してtmp_Insertedテーブルとtmp_Deletedテーブルから選択すると、我々が扱っている値が何であるかがわかるので、問題はありません。事をさらに複雑にするために、INSERT INTOステートメントを単独で実行すると、新しく挿入された行が期待どおりに表示されます。

+2

tmp_insertedおよびtmp_deletedテーブルを作成していて、トリガーでそれらを使用していません。それは意図された行動ですか?これはあなたの問題を解決することはできませんが、これらの2つのテーブルを削除するか、インラインINSERTステートメントでそれらを使用することができます。 – Swapnil

+0

@Swapnil一時テーブルは、私たちがこの問題をデバッグするのに役立つだけであり、トリガーが働いたときに実行されます。今のところ、INSERTとDELETEの値を見ることができ、必要に応じてAUDIT_TRAILテーブルに格納されているものを確認するためにクエリに入れ替えることができます。 –

+0

ここには何も本質的に間違っているとは思われません。しかし、テーブルがなければ、何が起こっているのか本当に私の頭を包み込むのは難しいです。 –

答えて

1

トリガー内のINSERT文のJOINによってデータがフィルタリングされないようにするには、INSERTEDのデータをインラインINSERTのすべてのテーブルに追加して挿入します。

SELECT I.* INTO tmp_inserted 
FROM dt 
INNER JOIN inserted i on i.DataTableId = dt.DataTableId 
LEFT JOIN deleted d etc.. 
関連する問題