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
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.
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
- 1. CASCADE Delete est-il exécuté en tant que transaction?
- 2. DB2 cascade delete commande?
- 3. Comment utiliser delete cascade dans mysql?
- 4. Sql server DELETE et WITH clause
- 5. SQL Server 2005 - Clés étrangères avec suppression en cascade
- 6. Aide en cascade de suppression SQL (question spécifique)
- 7. SQL Suppression en cascade sans clé étrangère?
- 8. Requête SQL imbriquée
- 9. transaction distribuée entre deux MS SQL Server 2005
- 10. SQL DELETE tombant dans PHPmyAdmin
- 11. sql rollback transaction 2005
- 12. SQL: cascade UNION et JOIN
- 13. Verrouillage dans SQL Server
- 14. SQL Delete (Suspendu dans le moniteur d'activité)
- 15. Boucle imbriquée en Python
- 16. Déclencheurs Cascade dans SQLite
- 17. Prise en charge de SQL Server 2005 pour la transaction autonome Oracle-style
- 18. MSBuild delete process
- 19. JPA: Reverse cascading delete
- 20. AJAX delete - en utilisant jQuery
- 21. hibernate cascade suppression
- 22. Problème de syntaxe/logique en cascade INNODB
- 23. Résolution en cascade dans Unity
- 24. ExtJs en cascade-Combos Problème
- 25. boucle dans trigger SQL Server
- 26. Problème de cascade NHibenate
- 27. Insertion en bloc SQL Server
- 28. C# SQL Transaction distribuée terminée. Soit enregistrez cette session dans une nouvelle transaction, soit la transaction NULL
- 29. Tests unitaires SQLite NHibernate a généré des relations en cascade
- 30. ADO.NET Entity Framework: Comment obtenir des suppressions automatiques en cascade?
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
Vous avez raison. Je viens de les ajouter pour être explicite, mais vous pouvez modifier votre clause WHERE à: OERE Department.CompanyID = @CompanyID – Brannon