Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server sqlserver中的历史表_Sql Server_Triggers - Fatal编程技术网

Sql server sqlserver中的历史表

Sql server sqlserver中的历史表,sql-server,triggers,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 varcha

我有两张桌子;第一个表名为
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
中插入另一行时,我有两个编号相同的
rgu NO

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

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

 ALTER TRIGGER [dbo].[DEL_HIST]
 ON  [dbo].[PAYMENT]
 AFTER  DELETE
 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 @PAYEUR = CT_NumPayeur FROM DELETED

 SELECT @RG_Montant = RG_Montant FROM DELETED
 SELECT @RG_DATE = RG_DATE FROM DELETED
SELECT @RGNO = RG_No FROM DELETED

DELETE FROM RECORDPAY  WHERE  
RG_NO=@RGNO and PAYEUR= @PAYEUR  and CAISSIER=@user_op and Montant=@RG_Montant 
END

只要
INSERT
语句一次插入超过一行,您的触发器就会中断——因为在这种情况下,您的触发器会被
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
它是任意和不确定的-您只需忽略
插入的
中的所有其他行

您需要重新编写触发器以将此考虑在内:

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

你犯了经典的触发器错误;假设插入的
中只有一行
。付款处理行中的另一个点永远不会被删除,通常通过另一次付款来取消第一次付款来完成付款撤销。谢谢您的回复,但您能举个例子吗。我不太明白如果你想删除一笔
5
的付款,你不会从付款中删除那一行,你会输入一笔
-5
的新付款来平衡它,你为什么对我们大喊大叫?用大写字母键入你的标题不会让你更快地得到答案,这很烦人,而且非常粗鲁。我们在这里都能读得很好,你不必大喊大叫就能引起注意。你也不必在任何场合乞求帮助。如果没有你的乞求,有人会帮助你的。请礼貌一点,不要大喊大叫。你在说什么,肯!!!!!!我不是粗鲁的,我写标题时没有引起注意。PS我在这里学习。如果你能帮忙,谢谢你,我很高兴。否则我不想讨论任何离题的事情