Comment garder sur les transactions quand il échoue pour certaines lignes?
-
20-09-2019 - |
Question
Je veux que quand j'exécute une requête par exemple DELETE FROM Contact
, et une erreur est soulevée lors de la transaction, elle doit supprimer les lignes qui peuvent supprimer soulever toutes les erreurs pertinentes pour les lignes qui ne peuvent pas être supprimés.
La solution
Pour SQL Server, vous ne vont pas casser l'atomicité de la commande Supprimer dans une instruction - même émis en dehors d'une transaction explicite, vous allez agir dans un un implicite - par exemple tout ou rien que vous avez vu.
Dans les domaines d'une transaction explicite une erreur par le rouleau par défaut de retour l'ensemble des transactions, mais cela peut être modifié pour essayer juste et rollback la seule déclaration que errored dans la transaction globale (de déclarations multiples) le réglage en est SET XACT_ABORT.
Étant donné que votre suppression est une seule déclaration, le XACT_ABORT ne peut pas vous aider -. La ligne est l'erreur et la suppression sera annulée
Si vous connaissez la condition d'erreur que vous allez faire face (comme une violation FK contrainte, vous pouvez vous assurer de supprimer a un approprié où la clause de ne pas tenter de supprimer des lignes que vous savez générer une erreur.
Autres conseils
Si vous utilisez MySQL vous pouvez
Ceci est une caractéristique qui dépend entièrement du goût de la base de données que vous utilisez. Certains auront et d'autres non. Par exemple, Oracle nous offre la possibilité d'enregistrer les erreurs DML en vrac. L'exemple dans la documentation utilise une instruction INSERT mais le même principe applique à toute déclaration DML.