Sql server 如何在多行上记录删除触发器后受影响的所有行

Sql server 如何在多行上记录删除触发器后受影响的所有行,sql-server,triggers,Sql Server,Triggers,我有多行具有相同报价编号的表QuoteDetail。 可以使用批量删除“从QuoteDetail中删除,其中QuoteNo='12345' 如何使用after delete触发器记录所有已删除的行? 下面是我的触发器脚本,但只记录了1行,其余的被丢弃 CREATE TRIGGER [dbo].[trgcsms_QuoteDetail_DeleteLogs] ON [CSMS].[dbo].[QuoteDetail] AFTER DELETE AS BEGIN SET NOCOU

我有多行具有相同报价编号的表QuoteDetail。 可以使用批量删除“从QuoteDetail中删除,其中QuoteNo='12345' 如何使用after delete触发器记录所有已删除的行? 下面是我的触发器脚本,但只记录了1行,其余的被丢弃

CREATE TRIGGER [dbo].[trgcsms_QuoteDetail_DeleteLogs] ON [CSMS].[dbo].[QuoteDetail] 
   AFTER DELETE
AS 
BEGIN
    SET NOCOUNT ON;
    DECLARE @QuoteNo varchar(50)
    DECLARE @SeqNo int
    DECLARE @ItemCode varchar(50)
    DECLARE @Qty float
    DECLARE @NetPrice float
    DECLARE @TotAmt float

    SELECT @QuoteNo = DELETED.[QuoteNo]
            ,@SeqNo = DELETED.[SeqNo]
            ,@ItemCode = DELETED.[ItemCode]
            ,@Qty = DELETED.[Qty]
            ,@TotAmt = DELETED.[TotAmt]
    FROM DELETED

    INSERT INTO [dbo].[QuoteDetailDeleteLogs]
           (
            [QuoteNo]
            ,[SeqNo]
            ,[ItemCode]
            ,[Qty]
            ,[TotAmt]
           )
           VALUES
           (
            @QuoteNo
            ,@SeqNo
            ,@ItemCode
            ,@Qty
            ,@NetPrice
            ,@TotAmt

           )
END

你几乎成功了。只是不使用“@variables”,而是使用表。因为毕竟,您需要多行,对吗?这也被称为“一张桌子”

同样值得注意的是,我冒昧地升级了触发器,使其也包含了UPDATE,因为更新是一种删除,之后会立即插入。所以我想,如果你更新一行,并将QuoteNo(报价编号)从“12345”改为“54321”,你会希望在审计跟踪中看到它(你的“QuoteDetailsLog”)

[2018年8月30日更新]

CREATE TRIGGER [dbo].[trgcsms_QuoteDetail_DeleteLogs] ON [CSMS].[dbo]. 
[QuoteDetail] 
 AFTER DELETE, UPDATE
AS 
BEGIN

INSERT INTO [dbo].[QuoteDetailDeleteLogs]
       (
        [QuoteNo]
        ,[SeqNo]
        ,[ItemCode]
        ,[Qty]
        ,[TotAmt]
       )
SELECT [QuoteNo]
        ,[SeqNo]
        ,[ItemCode]
        ,[Qty]
        ,[TotAmt]
FROM DELETED
END

保持简短

这里的问题是触发器只需要一行。不要给变量赋值(或
DECLARE
),只需
将它们插入表中即可。@Larnu,这就像魔术一样!谢谢你的建议。那真是个好朋友!是的,我只是想直接加载到logs表,以确保如果有人想要恢复详细信息,我仍然有优势。非常感谢您的想法。无需将其插入临时表中。只需在已删除表的insert语句中选择它。