2008-09-12 3 views
0

Supposons que j'ai une table appelée Companies qui a une colonne DepartmentID. Il y a aussi une table Departaments qui a comme colonne EmployeeID. Bien sûr, j'ai aussi une table des employés. Le problème est que je veux supprimer une entreprise, donc d'abord je dois supprimer tous les employés pour chaque département et ensuite tous les départements de l'entreprise. Cascade Delete n'est pas une option, par conséquent je souhaite utiliser des transactions imbriquées. Je suis nouveau à SQL donc j'apprécierais votre aide.Transaction SQL Server imbriquée en cascade delete

Répondre

4

Je ne sais pas pourquoi vous avez besoin des transactions imbriquées ici. Vous avez seulement besoin d'une transaction réelle:

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 

Notez le double à partir, ce n'est pas une faute de frappe, il est la syntaxe SQL correcte pour effectuer une JOIN dans un SUPPR.

Chaque instruction est atomique, soit l'intégralité de DELETE réussira ou échouera, ce qui n'est pas si important dans ce cas car le lot entier réussira ou échouera.

BTW- Je pense que vous aviez vos relations à rebours. Le ministère n'aurait pas d'ID employé, l'employé aurait un ID ministériel.

+0

Vos requêtes peuvent être optimisées pour supprimer les INNER JOINs sur la société. Ou serait-ce quelque chose que SQL Server ferait automatiquement? – rpetrich

+0

Vous avez raison. Je viens de les ajouter pour être explicite, mais vous pouvez modifier votre clause WHERE à: OERE Department.CompanyID = @CompanyID – Brannon

0

Je ne réponds pas à votre question, mais les clés étrangères est le chemin à parcourir, pourquoi n'est-ce pas une option?

En ce qui concerne les transactions imbriquées, ils sont:

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 il semble différent bien sûr, mais qui aurait dépendent de la plate-forme que vous utilisez