0

削除されたトランザクションを追跡するトリガーがあります。前後のトランザクション レコードの値を、TransHistory という別のテーブルに格納します。問題は、レコードを削除すると、削除されたレコードだけでなく、その前に、顧客の DataGridView に存在する最上位のレコードが更新として挿入されることです。ここに私の削除トリガーがあります:

USE [dbPB]
GO
/****** Object:  Trigger [dbo].[delete_history]    Script Date: 05/28/2013 19:40:13       ******/
 SET ANSI_NULLS ON
 GO
 SET QUOTED_IDENTIFIER On
 GO

 ALTER TRIGGER [dbo].[delete_history] ON [dbo].[Transaction]
 FOR DELETE
 AS
 INSERT TransHistory (CustomerID, TransactionID, Buyin, 
                        Cashout, CreditPaid, Type,
                         Date, action)
 SELECT CustomerID, TransactionID, Buyin, Cashout, 
   CreditPaid, Type, GETDATE(), 'DELETED' 
 FROM deleted

ここに私のUPDATEトリガーがあります:

 USE [dbPB]
 GO
 /****** Object:  Trigger [dbo].[update_history]    Script Date: 05/28/2013 20:24:28      ******/
 SET ANSI_NULLS ON
 GO
 SET QUOTED_IDENTIFIER ON
 GO
 ALTER TRIGGER [dbo].[update_history] ON [dbo].[Transaction]
 FOR UPDATE
 AS
 INSERT TransHistory (CustomerID, TransactionID, Buyin, 
                         Cashout, CreditPaid, Type,
                         Date, action)
 SELECT top (1) CustomerID,TransactionID, Buyin, Cashout, CreditPaid, Type,
             GETDATE(), 'BEFORE UPDATE' 
 FROM deleted

 INSERT TransHistory (CustomerID, TransactionID, Buyin, Cashout,
                         CreditPaid, Type, 
                         Date, action)
 SELECT top(1) CustomerID, TransactionID, Buyin, Cashout, CreditPaid, Type,
             GETDATE(), 'AFTER UPDATE' 
 FROM inserted
4

1 に答える 1

1

更新と削除を送信していると思います。プロファイラーを使用して、トリガーが削除によって呼び出されたときにデータベースに送信されるものを正確に確認します。アプリケーションではなく SSMS から削除ステートメントを実行してみてください。おそらくプロファイラーで、削除ステートメントのみが送信されたことを確認し、データをチェックして、削除トリガーのみが起動されたかどうかを確認します。次に、アプリケーションから同じことを行い、1 つではなく 2 つのステートメントが送信されることを確認します。少なくともこれで、問題がトリガーなのかアプリケーションなのかがわかりますが、私はアプリケーションに賭けています。

于 2013-05-28T20:12:08.620 に答える