2017-05-03 5 views
0

Ich schrieb einen Trigger in T-SQL mit Microsoft SQL Server Management Studio und nachdem ich einen Fehler bemerkte, verengte ich meinen Auslöser. Dies hat dazu geführt, dass einer meiner Auslöser nicht mehr funktioniert und ich kann nicht herausfinden warum.Trigger nach dem Löschen funktioniert nicht nach der Änderung

Der Workflow soll dies sein: Delete Event, EventEdition wird durch einen Fremdschlüssel auf EventId gelöscht. Da die Ausrüstung nicht mehr benötigt wird, sollte die Nummer der Ausrüstung hinzugefügt werden, um die Verfügbarkeit der Ausrüstung in einer Tabelle mit dem Namen EquipmentApplications zurück zu geben.

Unten ist mein Code. Ich habe die Verfügbarkeit auf Einsatz reduzieren zu arbeiten und hatte dieses Add Verfügbarkeit nach Löscharbeiten, bis ich es hinzugefügt, um nur für dieses Datum

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

Ihr Trigger hat einen ** MAJOR ** Fehler, in dem Sie davon ausgehen, dass es ** einmal pro Zeile ** genannt wird - das ist nicht der Fall. Der Trigger wird ** einmal pro Anweisung ** ausgelöst. Wenn Ihre DELETE-Anweisung also 25 Zeilen betrifft, erhalten Sie den Trigger einmal ** ausgelöst, aber dann enthält die Pseudo-Tabelle "Gelöscht" 25 Zeilen. Welche dieser 25 Zeilen wird Ihr Code hier auswählen? 'Wählen Sie @eventEquipmentId = EventEquipmentId aus gelöscht;' - es ist nicht deterministisch, Sie erhalten ** eine beliebige Zeile ** und Sie werden ** ignorieren alle anderen Zeilen **. Sie müssen Ihren Trigger neu schreiben, um dies zu berücksichtigen! –

+0

Die Löschanweisung betrifft jeweils nur eine Zeile. – throwaway3834

+0

Möglicherweise wird eine Zeile gelöscht, Sie sollten jedoch auf das Löschen von Datenmengen vorbereitet sein. Auch neue Entwickler sind nicht all diese Dinge bewusst, so dass Sie in wichtigen biz Regel besonders vorsichtig sein sollten.Auch wenn Sie hv so viele ID dann was ist die Notwendigkeit für eventdate? Etwas scheint nicht rgihts unter Tabelle relation.you kann einfügen kopieren Ihr Triggerskript in SSMS und anstelle des gelöschten put Real Tabellenname. So können Sie es debuggen. – KumarHarsh

Antwort

0

Sie hv so oft wählen verwenden .. von nur Variable aufzufüllen gelöscht. Verwenden Sie stattdessen eine Auswahl und füllen Sie alle Variablen auf.

Beachten Sie auch die alternative query.Relation zwischen Tabellen sind nicht klar.

Verwandte Themen