我有两张桌子;第一个名为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
答案 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