4

下面是我的触发器:

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

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

我该如何改变?

4

5 回答 5

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)
于 2012-07-19T18:17:56.150 回答
1

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

DELETE FROM  VisitorMaster WHERE Id=85 or Id=86 
于 2012-12-27T12:25:55.183 回答
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

于 2015-09-23T16:35:17.950 回答
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
于 2012-07-19T19:02:25.160 回答
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 插入和其他行等

于 2020-09-22T17:42:51.473 回答