2011-01-19 1 views
1

J'ai besoin de conserver certaines données de journal dans différentes tables même si ma transaction est annulée.Dans SQL Server 2005 émulant une transaction autonome

je l'ai déjà appris que dans SQL Server, il est impossible faire quelque chose comme ça

begin tran t1 
insert ... 
insert ... 
select ... 
     begin tran t2 
     insert into log 
     commit tran t2 
rollback tran t1 
select * from log -- IS EMPTY ALWAYS 

J'essaie piratage SQL Server que je madded CLR qui va exporter les données ont besoin pour LOG sur le disque du serveur local en format XML. CLR code est simple car il peut être:

File.WriteAllText(fileName, xmlLog.Value.ToString()); 

Avant le relâches dans des bases de production amour Ill entendre vos toughs sur cette technique.

Voici quelques questions:

  • Y at-il d'autres une meilleure façon d'accomplir la transaction autonome dans SQL Server 2005
  • Comment peut-être mauvais tenant ma transaction non validée alors que SQL Server est en cours d'exécution CLR (quantité de données écrites par SQL est relativement petit environ 50 - 60 enregistrements de 3 entiers et 4 flottants)
+0

Avez-vous déjà lu cet article? http://blogs.msdn.com/b/sqlprogrammability/archive/2008/08/22/how-to-create-an-autonomous-transaction-in-sql-server-2008.aspx –

+0

@Martin partiellement je l'ai fait, Mais je pense que cette technique est seulement possible dans MSSQL 2008 ma production est toujours sur 2005 – adopilot

+0

Il y a 3 autres alternatives au bas de l'article que l'auteur dit s'applique aux deux. –

Répondre

3

Je suggère d'utiliser une variable de table car elle n'est pas affectée par la transaction (c'est l'une des méthodes énumérées dans le blog noté par Martin bel Doit la question). Pensez à faire cela, qui fonctionnera dans SQL Server 2005:

DECLARE @TempLog TABLE (FieldList...) 

BEGIN TRY 

    BEGIN TRAN 

    INSERT... 

    INSERT INTO @TempLog (FieldList...) VALUES (@Variables or StaticValues...) 

    INSERT... 

    INSERT INTO @TempLog (FieldList...) VALUES (@Variables or StaticValues...) 

    COMMIT TRAN 

END TRY 
BEGIN CATCH 

    IF (@@TRANCOUNT > 0) 
    BEGIN 
     ROLLBACK TRAN 
    END 

    /* Maybe add a Log message to note that we ran into an error */ 
    INSERT INTO @TempLog (FieldList...) VALUES (@Variables or StaticValues...) 

END CATCH 

INSERT INTO RealLogTable (FieldList...) 
    SELECT FieldsList 
    FROM @TempLog 

S'il vous plaît noter que si nous faisons usage du fait que le tableau des variables ne font pas partie de la transaction, qui ne crée une situation potentielle où ce code ne COMMIT mais les erreurs (ou les plantages du serveur) avant le INSERT INTO RealLogTable et vous aurez perdu la journalisation pour les données qui l'ont fait entrer. À ce stade il y aurait une déconnexion car il y a des données mais aucun enregistrement de lui étant inséré comme RealLogTable est concerné. Mais c'est juste le compromis évident pour être en mesure de contourner la transaction.