私は、監査目的のために、ストアドプロシージャのバックオフを実行して特定のデータ変更と挿入をキャプチャするトリガを持っています。 テーブル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ステートメントを単独で実行すると、新しく挿入された行が期待どおりに表示されます。
tmp_insertedおよびtmp_deletedテーブルを作成していて、トリガーでそれらを使用していません。それは意図された行動ですか?これはあなたの問題を解決することはできませんが、これらの2つのテーブルを削除するか、インラインINSERTステートメントでそれらを使用することができます。 – Swapnil
@Swapnil一時テーブルは、私たちがこの問題をデバッグするのに役立つだけであり、トリガーが働いたときに実行されます。今のところ、INSERTとDELETEの値を見ることができ、必要に応じてAUDIT_TRAILテーブルに格納されているものを確認するためにクエリに入れ替えることができます。 –
ここには何も本質的に間違っているとは思われません。しかし、テーブルがなければ、何が起こっているのか本当に私の頭を包み込むのは難しいです。 –