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.

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top