Angenommen, ich habe eine Tabelle namens Companies mit einer Spalte DepartmentID. Es gibt auch eine Departaments-Tabelle mit der Spalte EmployeeID. Natürlich habe ich auch eine Mitarbeiter-Tabelle. Das Problem ist, dass ich eine Firma löschen möchte, zuerst muss ich alle Angestellten für jede Abteilung und dann alle Abteilungen in der Firma löschen. Cascade Delete ist keine Option, daher möchte ich verschachtelte Transaktionen verwenden. Ich bin neu in SQL, daher würde ich Ihre Hilfe zu schätzen wissen.Geschachtelte SQL Server-Transaktion, die Kaskadenlöschung durchführt
Antwort
Ich bin mir nicht sicher, warum Sie verschachtelte Transaktionen benötigen Hier. Sie benötigen nur eine tatsächliche Transaktion:
BEGIN TRAN
DELETE FROM Employee
FROM Employee
INNER JOIN Department ON Employee.DepartmentID = Department.DepartmentID
INNER JOIN Company ON Department.CompanyID = Company.CompanyID
WHERE Company.CompanyID = @CompanyID
DELETE FROM Department
FROM Department
INNER JOIN Company ON Department.CompanyID = Company.CompanyID
WHERE Company.CompanyID = @CompanyID
DELETE FROM Company
WHERE Company.CompanyID = @CompanyID
COMMIT TRAN
Notiere die doppelte FROM, das ist kein Tippfehler, es ist die richtige SQL-Syntax für eine in einer DELETE JOIN ausführen.
Jede Anweisung ist atomar, entweder das gesamte DELETE wird erfolgreich sein oder fehlschlagen, was in diesem Fall nicht so wichtig ist, weil der gesamte Batch erfolgreich sein oder fehlschlagen wird.
BTW- Ich denke, du hattest deine Beziehungen rückwärts. Die Abteilung hätte keine EmployeeID, der Employee hätte eine DepartmentID.
Ich beantworte Ihre Frage nicht, aber ausländische Schlüssel ist der Weg zu gehen, warum ist es keine Option?
Wie für verschachtelte Transaktionen sind sie:
BEGIN
delete from Employee where departmentId = 1;
BEGIN
delete from Department where companyId = 2;
BEGIN
delete from Company where companyId = 2;
END
END
END
Programmatically sieht es natürlich anders, aber das würde auf der Plattform ab, die Sie verwenden
Ihre Abfragen können optimiert werden, um die INNEREN JOINs des Unternehmens zu entfernen. Oder wäre dies etwas, was SQL Server automatisch tun würde? – rpetrich
Sie haben Recht. Ich habe sie nur hinzugefügt, um explizit zu sein, aber Sie könnten Ihre WHERE-Klausel wie folgt ändern: WHERE Department.CompanyID = @CompanyID – Brannon