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我在这里学习。如果你能帮忙,谢谢你,我很高兴。否则我不想讨论任何离题的事情