Sql 有问题的触发器-删除时

Sql 有问题的触发器-删除时,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个触发器,可以跟踪已删除的事务。它将前后事务记录值存储到另一个名为TransHistory的表中。问题是,当我删除一条记录时,它不仅存储已删除的记录,而且在删除之前,它会将任何客户的DataGridView中存在的顶级记录作为更新插入。这是我的删除触发器: USE [dbPB] GO /****** Object: Trigger [dbo].[delete_history] Script Date: 05/28/2013 19:40:13 ******/ SET A

我有一个触发器,可以跟踪已删除的事务。它将前后事务记录值存储到另一个名为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
这是我的更新触发器:

 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

我认为您正在发送更新和删除。我将使用profiler查看当delete调用触发器时发送到数据库的内容。您可以尝试从SSMS而不是应用程序执行delete语句,并且可以在探查器中看到只发送了delete语句,并检查数据以查看是否只触发了delete触发器。然后在应用程序中执行同样的操作,并查看发送的是两个状态,而不是一个。至少这会告诉你问题是触发器还是应用程序,但我赌的是应用程序。

删除记录时是否运行了探查器?我不确定。。。这是我的第一个触发器,所以在执行
DELETE
时会执行这两个触发器。触发器看起来很好(除了
top 1
——触发器在每次更新时调用一次;只存档一行没有意义)。问题可能出在客户端-表单意外地更新检索到的行并将其保存回去。你使用ORM吗?实体框架还是什么?不是。如果直接从Sql Server Management Studio删除记录会发生什么?如果其行为相同,则触发器错误;如果没有,表单将更改数据。正如Nikola和HLGEM所述,触发器工作正常。我已经直接从数据库中删除了一条事务记录,只有删除的记录存储在数据库中。因此,应用程序会产生问题。但是既然我想在我的datagrid中获得最新(更新)的信息,我该如何处理呢?谢谢好的,问题出在这里。这行代码是我用来通过数据集更新数据库的:Me.TransactionTableAdapter.update(Me.DbPBDataSet)你们知道我应该用什么来继续更新吗?我不是一个应用程序开发人员,你们可能想就此提出一个单独的问题,以吸引,但是您应该为网格选择数据,而不是更新它。