Verschachtelte SQL Server-Transaktion durchführt Kaskade löschen
-
09-06-2019 - |
Frage
Angenommen, ich eine Tabelle namens Firmen haben, die eine DepartmentID Spalte hat. Es gibt auch eine Departaments Tabelle, die als EmployeeID-Spalte hat. Natürlich habe ich auch ein Employee-Tabelle. Das Problem ist, dass ich eine Firma zu löschen, so habe ich zunächst alle Mitarbeiter für jeden departament löschen und dann alle departaments im Unternehmen. Cascade Löschen ist keine Option, deshalb wünsche ich verschachtelte Transaktionen verwenden. Ich bin neu in SQL so würde ich Ihre Hilfe zu schätzen wissen.
Lösung
Ich bin mir nicht sicher, warum Sie verschachtelte Transaktionen hier benötigen. 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
die doppelten Hinweis aus, dass kein Tippfehler, es ist die richtige SQL-Syntax für ein in einem DELETE JOIN ausgeführt wird.
Jede Aussage ist atomar, entweder die gesamte DELETE Erfolg haben wird oder nicht, was in diesem Fall nicht so wichtig ist, weil die gesamte Charge wird entweder Erfolg oder Misserfolg.
BTW Ich glaube, Sie rückwärts Ihre Beziehungen hatten. Die Abteilung würde keine EmployeeID hat, würde der Arbeitnehmer eine DepartmentID hat.
Andere Tipps
ich Ihre Frage nicht beantworten, aber Fremdschlüssel ist der Weg zu gehen, warum ist es nicht eine 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 hängen von der Plattform, die Sie mit