Sql server 更改后删除后的触发器不起作用
我使用MicrosoftSQLServerManagementStudio在T-SQL中编写了一个触发器,在注意到一个缺陷后,我缩小了触发器的范围。这使得我的一个触发器停止工作,我不知道为什么 工作流应该是这样的:删除事件,通过EventId上的外键,删除EventEquipment。由于不再需要设备,因此需要的设备数量应添加回名为EquipmentAvailabilities的表中的设备可用性 下面是我的代码。我在插入工作时降低了可用性,并在删除工作后增加了可用性,直到我添加到该日期为止Sql server 更改后删除后的触发器不起作用,sql-server,tsql,triggers,Sql Server,Tsql,Triggers,我使用MicrosoftSQLServerManagementStudio在T-SQL中编写了一个触发器,在注意到一个缺陷后,我缩小了触发器的范围。这使得我的一个触发器停止工作,我不知道为什么 工作流应该是这样的:删除事件,通过EventId上的外键,删除EventEquipment。由于不再需要设备,因此需要的设备数量应添加回名为EquipmentAvailabilities的表中的设备可用性 下面是我的代码。我在插入工作时降低了可用性,并在删除工作后增加了可用性,直到我添加到该日期为止 cr
create trigger trgAddNumberAvailable
on EventEquipments
after delete
as
begin
declare @eventEquipmentId int;
select @eventEquipmentId = EventEquipmentId
from deleted;
declare @eventId int;
select @eventId = EventId
from deleted;
--selects the eventID from EventEquipment
declare @eventDate date;
select @eventDate = EventDate
from Events
where Events.EventId = @eventId;
--finds the date for the Event that was chosen above becuase EventEquipment does not contain date
declare @equipmentId int;
select @equipmentId = EquipmentId
from deleted
where deleted.EventEquipmentId = @eventEquipmentId;
declare @numberRequested int;
select @numberRequested = NumberOfEquipmentNeeded
from deleted
where deleted.EventEquipmentId = @eventEquipmentId;
update EquipmentAvailabilities
set NumberAvailable = NumberAvailable + @numberRequested
where EquipmentId = @equipmentId
and EquipmentAvailabilityDate = @eventDate;
--will update the availability for the equipment from insert and the date it is
--available that was chosen from the Event date from the event that was deleted
你已经用了很多次了选择。。从删除只是为了填充变量。 而是使用一个选择并填充所有变量 还要注意另一个查询。表之间的关系不清楚
create trigger trgAddNumberAvailable
on EventEquipments
after delete
as
begin
declare @eventEquipmentId int;
declare @eventId int;
declare @eventDate date;
declare @equipmentId int;
declare @numberRequested int;
select @eventEquipmentId = EventEquipmentId, @eventId = EventId
,@equipmentId = EquipmentId,@numberRequested = NumberOfEquipmentNeeded
from deleted;
--selects the eventID from EventEquipment
select @eventDate = EventDate
from Events
where Events.EventId = @eventId;
--finds the date for the Event that was chosen above becuase EventEquipment does not contain date
update EquipmentAvailabilities
set NumberAvailable = NumberAvailable + @numberRequested
where EquipmentId = @equipmentId
and EquipmentAvailabilityDate = @eventDate;
--will update the availability for the equipment from insert and the date it is
--available that was chosen from the Event date from the event that was deleted
--OR (alternative query for bulk delete ,(Correct the join))
update EquipmentAvailabilities
set NumberAvailable = NumberAvailable + @numberRequested
from EquipmentAvailabilities EA
inner join deleted d
on ea.EquipmentId = d.equipmentId
inner join Events E
on d.EventId=e.EventId
where
ea.EquipmentAvailabilityDate = e.eventDate;
您的触发器有一个主要缺陷,您似乎认为它每行调用一次,但事实并非如此。每个语句触发一次触发器,因此如果DELETE语句影响25行,则触发一次触发器,但删除的伪表将包含25行。您的代码将在此处选择这25行中的哪一行??从已删除中选择@eventEquipmentId=eventEquipmentId;-这是不确定的,您将得到一个任意行,而忽略所有其他行。你需要重写你的触发器来考虑这一点!delete语句一次只影响一行。它可能正在删除一行,但您应该为批量删除做好准备。另外,新开发人员不知道所有这些事情,所以在重要的业务规则中,您应该格外小心。此外,当您有这么多id时,那么eventdate需要什么?表关系中似乎没有什么问题。您可以复制粘贴触发脚本在SSMS中,而不是删除put实际表名。这样您可以调试它。