2012-07-19 105 views
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 

这个工程上删除单行罚款。但是当删除多行时,只有一次触发操作完成。

我该如何改变?

回答

10

SQL服务器将触发火灾触发所有行的一个实例;该deleted表将包含所有行更新,所以你不能单一实例存储在一个变量。

摆脱下面的代码行的:

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

你更新statment应该是这样的:

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) 
+0

@AaronBertrand - 我想到了一个'或'声明,但如果在' flightID'在'hfFlightID'和'rfFlightID'中?它不应该增加两次吗?我不知道用户的数据结构是否可行。如果没有,那么是的,肯定合并这两个陈述。 – LittleBobbyTables 2012-07-19 18:21:46

+0

当您设置一个标量变量,从插入或删除一个值,你将最有likley不能处理多行的触发器。当然,触发测试应该包括多行插入/更新/删除以及单行测试。最糟糕的部分是它会导致数据完整性问题,因为触发器不会失败,它只会作用于一条记录。根据我的经验,最终大多数带有触发器的表都需要从文件或某些文件导入数据。总是计划多行。并且不要使用游标或while循环来处理多个记录!这可以杀死数据库性能。 – HLGEM 2012-07-19 18:31:34

+0

THX您的意见,但仍然只有一个行被删除 – user168507 2012-07-19 18:44:25

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 
+0

将删除被删除触发另一台命名为客户 – user168507 2012-07-19 19:05:29

+1

解雇我会检查,看看是否其他的删除触发器不正确wirtten只在处理一行。 – HLGEM 2012-07-19 22:02:27

+0

即使我的倍数经由SQL仅删除一个触发操作完成(从xxx其中id = 1或ID = 2删除) – user168507 2012-07-20 09:15:12

1

可以删除多行。但你必须把多个ID。例如:

DELETE FROM VisitorMaster WHERE Id=85 or Id=86