2017-05-03 68 views
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 
+1

你的觸發器有一個** MAJOR **缺陷,你似乎認爲它會被稱爲**每行**一次 - 事實並非如此。觸發器會在每個語句**中觸發一次**,所以如果你的DELETE語句影響了25行,你將觸發**觸發一次**,但是那麼'Deleted'僞表將包含25行。您的代碼在這25行中選擇哪一個? 'select @eventEquipmentId = EventEquipmentId from deleted;' - 這是非確定性的,你會得到**一個任意的行**,你將**忽略所有其他行**。你需要重寫你的觸發器來考慮這個問題! –

+0

刪除語句一次隻影響一行 – throwaway3834

+0

它可能會刪除一行,但您應該爲批量刪除做好準備。 另外新的開發人員不知道所有這些東西,所以你應該在重要的商業規則中額外的謹慎。當你使用這麼多的id時,那麼eventdate的需求是什麼?在表格關係中看起來似乎不存在任何東西。你可以複製粘貼你在SSMS中的觸發器腳本,而不是刪除把真實的表名。這種方式,你可以調試它。 – KumarHarsh

回答

0

你HV使用了這麼多次選擇..從刪除只是爲了填充變量做後將其刪除工作過這種附加的可用性。 改爲使用一個選擇並填充所有變量。

另請注意替代查詢。表之間的關係不清楚。

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;