2016-12-05 1 views
0

Ich habe die folgende TriggerMS SQL Server-Trigger Vor Löschen

ALTER TRIGGER SystemClearConfiguration 
ON Systems 
FOR DELETE 
AS 
BEGIN 
    UPDATE Configurations SET ReceiverId = NULL WHERE ReceiverId = (SELECT deleted.Id from deleted); 
    UPDATE Configurations SET SenderId = NULL WHERE SenderId = (SELECT deleted.Id from deleted); 
END 
GO 

Wenn ich in die Datenbank gehen direkt auf Systemen klicken und klicken Sie auf „Bearbeiten Top 200“ und versuchen, eine Zeile zu löschen, die ich ich weiß, bekomme immer den Fehler über den FK auf Tabellenkonfigurationen.

Der einzige Grund, den ich sehe, ist der Trigger nicht vor dem Löschen ausgeführt. Auf Oracle weiß ich, dass man VOR oder NACHFOLG sagen kann, aber auf SQL kann ich solche Option nicht finden.

EDIT 1 - 2016-12-07

NOTE: DataTypes might not be correct

HINWEIS: Datatypes möglicherweise nicht korrekt

Fehler

enter image description here

enter image description here

+0

Könnten Sie bitte die vollständige Fehlermeldung bereitstellen? Und vielleicht könnten Sie uns auch Ihre Tabellenstrukturen einschließlich der Schlüsselspalten zeigen? – Tyron78

+0

Hallo @ Tyron78, ich habe gerade die von Ihnen angeforderte Information hinzugefügt. – FEST

+0

Nach dem Fehler deines Auslösers zu urteilen, würde ich sagen, dass der Grund ziemlich einfach ist: NULL ist keine gültige ReceiverId ... deshalb stürzt der FK ab. Vielleicht möchten Sie einen Dummy-Systemeintrag mit ID -1 und Name "Nicht zugewiesen" definieren und diesen anstelle der NULL-Aktualisierung verwenden. – Tyron78

Antwort

2
sein

Der folgende Trigger hat den Trick für mich:

ALTER TRIGGER SystemClearConfiguration 
ON Systems 
INSTEAD OF DELETE 
AS 
BEGIN 
    UPDATE Configurations SET ReceiverId = NULL WHERE ReceiverId IN (SELECT deleted.Id from deleted); 
    UPDATE Configurations SET SenderId = NULL WHERE SenderId IN (SELECT deleted.Id from deleted); 
    DELETE Systems WHERE Id IN (SELECT deleted.Id from deleted); 
END 
GO 
+0

Danke @ Tyron78. Es ist eine Schande, dass wir nicht auf den alten und neuen Wert wie in Orakel zugreifen können. – FEST

+0

Ja, es ist ein bisschen anders in SQL Server. Aber "eingefügt" und "gelöscht" machen die meiste Zeit gute Arbeit. – Tyron78