Domanda

Supponiamo di avere una tabella denominata Companies con una colonna DepartmentID.C'è anche una tabella Departaments che ha come colonna EmployeeID.Ovviamente ho anche una tabella Employee.Il problema è che voglio eliminare un'azienda, quindi prima devo eliminare tutti i dipendenti di ogni dipartimento e poi tutti i dipartimenti dell'azienda.L'eliminazione a cascata non è un'opzione, quindi desidero utilizzare transazioni nidificate.Sono nuovo in SQL quindi apprezzerei il tuo aiuto.

È stato utile?

Soluzione

Non sono sicuro del motivo per cui hai bisogno di transazioni nidificate qui.Hai solo bisogno di una transazione effettiva:

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

Nota il doppio FROM, non è un errore di battitura, è la sintassi SQL corretta per eseguire un JOIN in un DELETE.

Ogni istruzione è atomica, l'intero DELETE avrà esito positivo o negativo, il che non è così importante in questo caso perché l'intero batch avrà esito positivo o negativo.

A proposito, penso che tu abbia avuto le tue relazioni al contrario.Il Dipartimento non avrebbe un EmployeeID, il Dipendente avrebbe un DepartmentID.

Altri suggerimenti

Non sto rispondendo alla tua domanda, ma a chiavi straniere È la strada da percorrere, perché non è un'opzione?

Per quanto riguarda le transazioni nidificate sono:

BEGIN
  delete from Employee where departmentId = 1;
  BEGIN
     delete from Department where companyId = 2;
     BEGIN
        delete from Company where companyId = 2;
     END
  END
END

Ovviamente a livello di programmazione sembra diverso, ma dipende dalla piattaforma che stai utilizzando

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top