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

时间:2018-06-04 06:57:56

标签: sql-server triggers

我有表QuoteDetail,其中多行具有相同的引号。 可以使用批量删除删除记录'从QuoteDetail删除其中QuoteNo ='12345' 如何使用删除后触发器记录所有已删除的行? 下面是我的触发器脚本,但只记录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

1 个答案:

答案 0 :(得分:1)

你几乎得到了它。只是不使用" @ variables"而是使用表格。因为毕竟你想要多行,对吧?这也被称为"表"。

另外值得注意的是 - 我冒昧地升级你的触发器也包括UPDATE,因为更新是一个DELETE,后来加入了一个直接的INSERT。所以我想如果你更新一行并且QuoteNo(报价编号)改变了' 12345'到' 54321'你会想要在你的审计线索(你的" QuoteDetailsLog")。

[更新于30Aug2018]

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

保持简短