0
我在使用Microsoft SQL Server Management Studio的T-SQL中編寫了一個觸發器,當我發現一個缺陷時,我縮小了觸發器的範圍。這使我的一個觸發器停止工作,我不知道爲什麼。刪除後的觸發器在更改後不起作用
工作流應該是這樣的:Delete Event,通過EventId上的外鍵,EventEquipment被刪除。由於不再需要設備,因此應將設備號碼添加回名爲設備可用性的表中設備的可用性。
以下是我的代碼。我對插入工作減少可用性和直到我加入到只對日期
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
你的觸發器有一個** MAJOR **缺陷,你似乎認爲它會被稱爲**每行**一次 - 事實並非如此。觸發器會在每個語句**中觸發一次**,所以如果你的DELETE語句影響了25行,你將觸發**觸發一次**,但是那麼'Deleted'僞表將包含25行。您的代碼在這25行中選擇哪一個? 'select @eventEquipmentId = EventEquipmentId from deleted;' - 這是非確定性的,你會得到**一個任意的行**,你將**忽略所有其他行**。你需要重寫你的觸發器來考慮這個問題! –
刪除語句一次隻影響一行 – throwaway3834
它可能會刪除一行,但您應該爲批量刪除做好準備。 另外新的開發人員不知道所有這些東西,所以你應該在重要的商業規則中額外的謹慎。當你使用這麼多的id時,那麼eventdate的需求是什麼?在表格關係中看起來似乎不存在任何東西。你可以複製粘貼你在SSMS中的觸發器腳本,而不是刪除把真實的表名。這種方式,你可以調試它。 – KumarHarsh