web-dev-qa-db-fra.com

Rollback Group de déclarations DDL

Travailler dans SQL Server 2008 R2, j'essaie de resserrer un ensemble d'instructions DDL en tant que groupe (penser à un script de mise à niveau pour une base de données), mais je rencontre des ennuis.

Prenez le code suivant:

begin try

begin tran

create table foo (i int)
alter table foo add x dog
insert into foo select 1,1
insert into foo select 1,1,1

commit tran

end try

begin catch

rollback tran
print @@error

end catch

Je m'attends à ce que l'essai d'échec de l'instruction ALTER TABLE, tombez sur la prise, le retour de la transaction et imprimez le message d'erreur. Cependant, si vous vérifiez vos objets/tables, vous verrez que FOO est toujours là (donc la table de création n'a donc pas annulé correctement).

select * from sys.objects where name = 'foo'

Qu'est-ce que je fais mal ici?

4
Derek Kromm

Les choses sont un peu plus simple IMHO. Votre bloc catch n'est pas appelé parce que votre code ne exécute. SQL Server reçoit un bloc de texte:

blah blah
blah
blah blah
blah

Il tente alors de donner un sens il analyse, ce qui le transforme en un arbre syntaxique, mais toujours pas encore runnable. Pour faire RUNNABLE il a besoin de le compiler et à ce stade, il bombes et une exception est levée. À aucun moment la demande d'exécuter effectivement, de sorte que votre bloc try/catch n'a même pas commencé. Ceci est toujours le cas avec des erreurs de syntaxe et de compilation par rapport aux erreurs d'exécution. Vous pouvez pousser la transaction et la gestion des exceptions un cadre sur la pile, soit en démarrant la transaction du client (par exemple. L'envelopper dans un TransactionScope) ou en ajoutant un cadre dans le lot (utilisation. Sp_executesql).

Mais hélas c'est une cause perdue. Faire une migration d'une transaction ne va jamais dans la pratique. À tout le moins penser à toutes les transactions que LDD soutien DOE morve et deuxième penser à ce qui se passera à votre journal lorsque vous émettez qui est la taille DDL-de-données (par exemple. ALTER TABLE ... ADD COLUMN ... VALEURS ).

Faites une sauvegarde, exécutez votre migration, si elle les bombes de restauration de la sauvegarde. Est la seule option viable.

3
Remus Rusanu