2008-09-12 6 views
0

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

4

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.

+0

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

+0

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

0

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

Verwandte Themen