Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

SQL Server : Comment conserver des données lors d’une transaction annulée (ROLLBACK)

Question de stagiaire : « Comment est-il possible de loguer (donc d'enregistrer les données) qui ont été passée en ROLLBACK dans une transaction ? »

En effet le ROLLBACK a pour effet d'annuler toutes les modifications qui ont eu lieu depuis le BEGIN TRANSACTION. Si vous êtes dans un TRIGGER l'effet s'applique à l'action qui a déclenché le trigger et à tous les triggers déclenchés suite à cette action. Le ROLLBACK annulera toute écriture faites quelque soit la base de données, même si vous avez insérer des données dans tempdb celles-ci seront supprimées.

Le seul moyen envisageable pour sauvegarder des données qui « survivent » au ROLLBACK est de passer par une variable. En effet celle-ci n'est pas impactée par le ROLLBACK.

Exemple ne fonctionnant pas :

BEGIN TRANSACTION

-- Essaye de modifier les données
UPDATE MaTable
SET xxx = 'xyz'
WHERE Id = 90

IF @@ERROR
BEGIN

   -- On essaye de loguer l'erreur 
    INSERT INTO LogTable 
    VALUES(@@ERROR, 'abc')    

ROLLBACK TRANSACTION
-- La table de Log est vide à cet endroit

END

Exemple qui fonctionnera grace à notre variable de type table :

DECLARE @logtable TABLE (ErrNum int, Descr varchar(50))

BEGIN TRANSACTION

-- Essaye de modifier les données

UPDATE MaTable
SET xxx = 'xyz'
WHERE Id = 90

IF @@ERROR
BEGIN

    -- On essaye de loguer l'erreur 
    INSERT INTO @logtable 
    VALUES(@@error, 'abc')    

    ROLLBACK TRANSACTION

END

-- Insère le contenu de la variable dans la table

INSERT INTO LogTable
SELECT * FROM @logtable

Dans le second exemple l'insertion se fait dans la table de Log après le ROLLBACK quand la transaction est terminée ce qui ne pose aucuns soucis.

Si en plus je veux avoir le ou les enregistrements sur lesquels a eu lieu l'erreur je m'appuie cet fois sur les fonctionnalités xml du moteur :

DECLARE @logtable TABLE (ErrNum int, Descr varchar(50), Contenu xml)

BEGIN TRANSACTION

-- Essaye de modifier les données

UPDATE MaTable
SET xxx = 'xyz'
WHERE Id = 90

IF @@ERROR
BEGIN

    -- On essaye de loguer l'erreur

    INSERT INTO @logtable 
    VALUES(@@error, 'abc', SELECT * FROM MaTable WHERE Id = 90 FOR XML AUTO)    

    ROLLBACK TRANSACTION

END

-- Insère le contenu de la variable dans la table

INSERT INTO LogTable
SELECT * FROM @logtable

Sur SQL Server 2000 vous pouvez remplacer le type xml par un type varchar ou nvarchar.

L'avantage de cette méthode est qu'elle fonctionne quelle que soit la structure de la table sur laquelle se produit l'erreur. Dans ce cas vous pouvez factoriser le code de « log » des erreurs dans une procédure stockée, en lui passant les paramètres nécessaires.

Bon sql…

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Publié jeudi 30 novembre 2006 19:54 par christian
Classé sous : ,

Commentaires

Pas de commentaires
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Le nouveau Gojira, c’est pour lundi… par CoqBlog le il y a 7 heures et 47 minutes

- SharePoint : nouvel article sur la mise en place des Scopes dans MOSS Searchs par Blog Technique de Romelard Fabrice le il y a 15 heures et 13 minutes

- Hello CS par Le Blog de julz le il y a 20 heures et 39 minutes

- MSDN/TechNet/Microsoft Days Tour 2008 à Lille les 13 et 14 Octobre ! par RedoBlog - The .NET Gentleman !!! le il y a 23 heures et 30 minutes

- MVC Pratique #07 - Un projet concret et le transfert des objets avec les ModelBinders par #Rui le 10-09-2008, 23:39

- SQL Server 2008 : Certifié - TS Admin (70-432) par SQL Server vu par Christian Robert le 10-09-2008, 10:58

- [WPF] Comment changer la couleur utilisée pour sélectionner les éléments d’un ItemsControl ? par Thomas Lebrun le 10-09-2008, 10:49

- Hello World! par Hamid's Place le 10-08-2008, 23:38

- SQL Profiler - Configuration pour un développeur - tracer les requêtes SQL de votre application par Atteint de JavaScriptite Aiguë [Cyril Durand] le 10-08-2008, 15:52

- Monitoring et Patron de méthode par Le blog de Marc Ranchin le 10-08-2008, 10:22