SQL Server中的历史表

时间:2016-06-29 13:09:32

标签: sql-server triggers

我有两张桌子;第一个名为PAYMENT,第二个是名为RecordPay的历史表。

我有两个触发器,第一个是插入,以便从Payment表中插入历史表记录。

以下是代码:

ALTER TRIGGER [dbo].[INSERT_HIST]
ON  [dbo].[PAYMENT]
FOR  INSERT
AS 
BEGIN
     DECLARE @User_op varchar(50) 
     DECLARE @RGNO varchar(50)

     DECLARE @PAYEUR varchar(50)
     DECLARE @DATESYS SMALLDATETIME 
     DECLARE @RG_DATE SMALLDATETIME 
     DECLARE @RG_Montant varchar(50)

     SELECT @User_op = cbUserName 
     FROM cbUserSession 
     WHERE cbSession = @@SPID

     SELECT @PAYEUR = CT_NumPayeur FROM INSERTED

     SELECT @DATESYS = GETDATE()
     SELECT @RG_Montant = RG_Montant FROM INSERTED
     SELECT @RG_DATE = RG_DATE FROM INSERTED
     SELECT @RGNO = RG_No FROM INSERTED

     INSERT INTO RecordPay (RG_NO, PAYEUR, CAISSIER, Montant, DATESYS,   DATECAI)
     VALUES (@RGNO, @PAYEUR, @user_op, @RG_Montant, @DATESYS, @RG_DATE)

这很有效,我的问题是当我从PAYMENT删除一行,RecordPay该记录存在,然后当我在PAYMENT中插入另一行时,我有两个{{1有相同的数字。

例如,我在RG_NO中插入了一行,RG_NO = 1然后我删除了,我创建了另一行RG_NO = 2,在recordPay(历史表)中我得到两行RG_NO = 1。 / p>

这是删除的触发器,但它不起作用

PAYMENT

1 个答案:

答案 0 :(得分:1)

一旦INSERT语句一次插入多行,您的触发器将 BREAK - 因为在这种情况下,您的触发器会被称为一次对于INSERT语句,Inserted将包含多行。

你从这里选择哪10行?

 SELECT @PAYEUR = CT_NumPayeur FROM INSERTED
 SELECT @RG_Montant = RG_Montant FROM INSERTED
 SELECT @RG_DATE = RG_DATE FROM INSERTED
 SELECT @RGNO = RG_No FROM INSERTED

这是任意且非确定性的 - 您只需忽略 Inserted中的所有其他行。

您需要重写触发器才能将其考虑在内:

ALTER TRIGGER [dbo].[INSERT_HIST]
ON  [dbo].[PAYMENT]
FOR  INSERT
AS 
BEGIN
     DECLARE @User_op varchar(50) 

     SELECT @User_op = cbUserName 
     FROM cbUserSession 
     WHERE cbSession = @@SPID

     -- insert a record for ALL the rows that were inserted into 
     -- your history table in a single, elegant, set-based statement
     INSERT INTO RecordPay (RG_NO, PAYEUR, CAISSIER, Montant, DATESYS,   DATECAI)
         SELECT
             RG_No, CT_NumPayeur, @User_op, RG_Montant, SYSDATETIME(), RG_Date
         FROM
             Inserted