2009-10-28 6 views
2

Avec mes scripts de mise à niveau de base de données, j'ai généralement un seul long script qui apporte les modifications nécessaires à cette version de base de données. Cependant, si une instruction échoue à mi-chemin du script, elle laisse la base de données dans un état incohérent. Comment puis-je faire de l'ensemble du script de mise à niveau une opération atomique? J'ai essayé juste d'encapsuler toutes les déclarations dans une transaction, mais cela ne fonctionne pas. Même avec SET XACT_ABORT ON, si une instruction échoue et annule les transactions, le reste des instructions continue. Je voudrais une solution qui ne nécessite pas que j'écrive IF @@ TRANCOUNT> 0 ... avant chaque déclaration. Par exemple:Scripts de mise à niveau atomique

SET XACT_ABORT ON; 
GO 

BEGIN TRANSACTION; 
GO 

CREATE TABLE dbo.Customer 
(
     CustomerID int NOT NULL 
    , CustomerName varchar(100) NOT NULL 
); 
GO 

CREATE TABLE [dbo].[Order] 
(
     OrderID int NOT NULL 
    , OrderDesc varchar(100) NOT NULL 
); 
GO 

/* This causes error and should terminate entire script. */ 
ALTER TABLE dbo.Order2 ADD 
    A int; 
GO 

CREATE TABLE dbo.CustomerOrder 
(
     CustomerID int NOT NULL 
    , OrderID int NOT NULL 
); 
GO 

COMMIT TRANSACTION; 
GO 

Répondre

1

La façon dont Red-Gate et d'autres travaux d'outils de comparaison est exactement comme vous le décrire ... ils vérifient @@ ERROR et @@ TRANCOUNT après chaque instruction, de la confiture dans une table #temp et à la fin, ils vérifient la table #temp. Si des erreurs se sont produites, ils annulent la transaction, sinon ils s'engagent. Je suis sûr que vous pouvez modifier n'importe quel outil génère vos scripts de changement pour ajouter ce genre de logique. (Ou au lieu de réinventer la roue, vous pouvez utiliser un outil qui crée déjà des scripts atomiques pour vous.)

+0

Pouvez-vous suggérer un quelconque desdits outils ? – NYSystemsAnalyst

+0

Je liste beaucoup dans ce billet de blog: http://is.gd/4H8iZ (J'ai une vaste expérience avec le produit Red-Gate, et je le recommande fortement, je n'ai pas beaucoup d'expérience avec les autres. le produit est comparable, mais RG est retranché ici, donc c'est ce que je continue à utiliser.) –