|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Candidat au titre de Membre du Club
![]() Ingénieur développement logiciels Inscription : mai 2005 Messages : 23 ![]() |
Bonjour à tous,
J'ai un problème de compréhension au niveau de l’exécution d'une transaction. Je vous montre les deux scripts que j'ai exécuté : Code :
Code :
Merci |
||||
|
|
00
|
|
|
#2 | ||||||||||||||||
|
Membre éprouvé
![]() ![]() Hamid MIRAIngénieur développement logiciels Inscription : septembre 2003 Messages : 177 ![]() |
Ci-dessous les explications du fait observé :
Cas 1 Code :
Code :
- Aucun des 2 messages, rollback ou commit ci-dessus, n'a été affiché à l'écran. En effet l'instruction @@error n'a pas intercepté l'erreur ! - Cependant, un Rollback implicite a été tout de même effectué suite à l'erreur générée par l'instruction DDL (DROP ...) - Le rollback implicite a eu pour effet l'annulation de la création de la table (@@trancout = 0). Ce qui explique pourquoi la table n'a donc pas été créée. Cas 2 Code :
Code :
- Aucun des 2 messages, rollback ou commit ci-dessus, n'a été affiché à l'écran. En effet l'instruction @@error n'a pas intercepté l'erreur ! - Mais contrairement au cas 1, la transaction n'a été ni validée ni annulée ! La transaction reste ouverte (@@TRANCOUNT = 1) ! (situation bien plus dangereuse que le cas 1 ) - La table a été créée, mais comme la transaction n'a pas été validé. la table n'est visible que pour la session en cours ! Si tu ouvre une deuxième fenêtre de l’éditeur et tu essais d’accéder à la table, tu auras le message suivant : ' Msg*208, Niveau*16, État*1, Ligne*1 Nom d'objet 'temp' non valide' CONCLUSION L'instruction @@error <> 0 n'intercepte pas toutes les erreurs ! Sous SQL server 2000 nous n'avions pas d'autres choix pour gérer les erreurs ! Mais à partir de SQL Server 2005 , 2008 etc.., il faut utiliser TRY ... CATCH pour apporter une solution “robuste” et élégante à ce genre de problème ayant trait à la gestion des erreurs : Solution pour "Cas 1" Code :
Code :
Code :
Code :
|
||||||||||||||||
|
|
20
|
|
|
#3 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 953 ![]() |
Il est surtout totalement anormale de mélanger DDL et DML dans une même procédures et en principe le DDL devrait être hors transaction, sauf cas particulier.
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#4 | ||
|
Candidat au titre de Membre du Club
![]() Ingénieur développement logiciels Inscription : mai 2005 Messages : 23 ![]() |
Bonjour et merci de cette réponse très détaillée.
Mais lorsque j'exécute le script suivant j'ai un soucis : Code :
La première fois que je l’exécute, l’exécution du code s’arrête au niveau de avec l'erreur suivante : Msg*208, Niveau*16, État*1, Ligne*5 Nom d'objet 'TOTO' non valide. A ce niveau là, la transaction ne s'est pas fini car si je fais sur la même page un DROP TABLE TEST , la commande réussit, Et un SELECT @@TRANCOUNT me renvoie 1. Par contre si j'execute le script deux fois d'affilés ou plus, les fois suivantes la transaction se fini jusqu'au bout, ma table n'est pas créée et j'ai comme message : Commande(s) réussie(s). Question subsidiaire : Y a t'il des opérations non 'ROLLBACKABLE' ? Merci |
||
|
|
00
|
|
|
#5 |
|
Candidat au titre de Membre du Club
![]() Ingénieur développement logiciels Inscription : mai 2005 Messages : 23 ![]() |
Bonjour SQL pro,
En fait dans l'entreprise pour laquelle je travaille pour chaque mise à jour de notre base de données, on crée un script qui contient toutes les nouveautés (CREATE VIEW, ALTER TABLE, INSERT, ...) Entre deux releases, nous avons donc un ensemble de scripts à passer chez chaque client. L'idée est d'embarquer cet ensemble de scripts dans une transaction afin de revenir à l'état initial s'il y a un problème. |
|
|
00
|
|
|
#6 | |||||
|
Membre éprouvé
![]() ![]() Hamid MIRAIngénieur développement logiciels Inscription : septembre 2003 Messages : 177 ![]() |
Citation:
Explication Lors de la première exécution le message est dû à l'étape de compilation du bloc T-SQL SQL:StmtRecompile , chose qui ne produit pas lors de la 2ème exécution du bloc -SQL. Code :
Pour corriger ce problème du moins erratique, il faut rajouter l'instruction SET XACT_ABORT ON Exemple : Code :
|
|||||
|
|
00
|
|
|
#7 | |||||
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 953 ![]() |
Citation:
Pour les évolutions de schéma, il est plus simple de prendre une sauvegarde de la base avant le modif et mettre en place un trigger DDL sur événement ALL_DATABASE qui tracera automatiquement toutes ces modif d'architecture. Exemple : Code :
Code :
Pourquoi en effet réinventer la roue ? A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|||||
|
00
|
|
|
#8 |
|
Candidat au titre de Membre du Club
![]() Ingénieur développement logiciels Inscription : mai 2005 Messages : 23 ![]() |
Bonjour et merci à tous les deux pour vos explications très détaillées.
Je ne connaissais pas 'SET XACT_ABORT', et j'ai maintenant bien compris l'étape de compilation du bloc T-SQL Pour les modifications de schéma, je vais me pencher sur la voie que me propose 'SQL pro'. A + |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com