删除多行的触发器

时间:2012-07-19 18:14:28

标签: sql-server-2008 tsql

以下是我的触发器:

ALTER TRIGGER [dbo].[trgPaxeDeleted]
   ON  [dbo].[paxe] 
   AFTER DELETE
AS 
declare
@HFflightID int,
@RFflightID int

BEGIN
        Select @HFflightID = hfFlightID, @RFflightID = rfFlightID from deleted

        -- Hinflug: flugKontingent hochsetzen --   
        UPDATE    flightdata
        SET       flightQuota = flightQuota + 1
        WHERE     (flightID = @HFflightID)

        -- Rückflug: flugKontingent hochsetzen --
        UPDATE    flightdata
        SET       flightQuota = flightQuota + 1
        WHERE     (flightID = @RFflightID)

END

这适用于删除单行。但是当删除多行时,只完成一次触发操作。

如何更改此内容?

5 个答案:

答案 0 :(得分:10)

SQL Server触发为所有行触发一个触发器实例; deleted表将包含所有正在更新的行,因此您无法将单个实例存储在变量中。

删除以下代码行:

Select @HFflightID = hfFlightID, @RFflightID = rfFlightID from deleted     

您的更新语句应如下所示:

UPDATE    flightdata         
SET       flightQuota = flightQuota + 1         
WHERE     flightID IN (SELECT hfFlightID FROM deleted)

UPDATE    flightdata         
SET       flightQuota = flightQuota + 1         
WHERE     flightID IN (SELECT rfFlightID FROM deleted)

答案 1 :(得分:1)

您可以删除多行。但你必须放多个id。例如:

DELETE FROM  VisitorMaster WHERE Id=85 or Id=86 

答案 2 :(得分:1)

我以此为例,并使用主键

进行删除
CREATE TRIGGER On_Delete 
 ON tblActivityArchive AFTER DELETE 
 AS   BEGIN 
     DELETE dbo.tblJobLinesArchive 
       FROM dbo.tblJobLinesArchive a
      INNER JOIN Deleted d ON a.ActivityRef = d.ActivityRef
END 

http://www.sqlservercentral.com/Forums/Topic484314-338-1.aspx

答案 3 :(得分:0)

删除触发器更改为

ALTER TRIGGER [dbo].[trgPaxeDeleted]
   ON  [dbo].[paxe] 
   AFTER DELETE
AS 
declare
@HFflightID int,
@RFflightID int

BEGIN

    SET NOCOUNT ON;     

    UPDATE    flightdata         
    SET       flightQuota = flightQuota + 1         
    WHERE     flightID IN (SELECT hfFlightID FROM deleted)

        UPDATE    flightdata         
    SET       flightQuota = flightQuota + 1         
    WHERE     flightID IN (SELECT rfFlightID FROM deleted)

END

答案 4 :(得分:0)

我遇到了同样的问题,并且找到了一个简单的解决方案。

首先,我创建了触发器表来存储已删除的列

CREATE TABLE dbo.XLogs (
  Field1 varchar(30),
  Field2 varchar(30),
  Field3 varchar(30),
  Field4 varchar(30),
  Field5 varchar(2)
);

然后我创建了触发器

CREATE TRIGGER dbo.TXLogs ON dbo.Table
AFTER DELETE
AS
BEGIN
   DECLARE @Id varchar(30)
   DECLARE @Field1 varchar(30)
   DECLARE @Field2 varchar(30)
   DECLARE @Field4 varchar(30)

   SELECT Id,Field1,Field2 INTO #DeletedTempTable FROM deleted

   WHILE(EXISTS(SELECT Id,Field1,Field2 FROM #DeletedTempTable))
   BEGIN
      SET @Field4 = 'Delete Row'
      SELECT TOP 1 @Id =Id , @Field1 = Field1, @Field2 = Field2 FROM #DeletedTempTable

      INSERT INTO dbo.XLogs VALUES (@Id,@Field1,@Field2,@Field4,'0')

      DELETE FROM #DeletedTempTable WHERE Id = @Id
   END
END

我创建了临时表来存储我的初始结果,然后使用while循环遍历它们。

在删除循环行之前,我选择了TOP 1仅列出一行,读取数据并将其存储在日志表中,然后再次循环以获取下一行。相同的逻辑可用于更新的行,只需将FROM删除项更改为FROM插入的行和其他行等