Estou trabalhando em um script que envolve muitas mudanças estruturais e gosto de retornar a uma condição "básica" enquanto trabalho no que tudo precisa ser alterado, então tenho minhas alterações agrupadas em uma transação de início/reversão.
Isso funciona muito bem SE não houver erros, mas quando cometo um erro (tentativa de descartar uma coluna que não existe ou que possui uma restrição FK, etc), a reversão não funciona. Portanto, os objetos que renomeei com sp_rename ou as colunas que descartei têm o nome errado/não existem.
Supondo que este seja um comportamento documentado/correto, onde está documentado? Provavelmente apenas meus olhos vidrados ... mas não consigo lembrar / encontrar nada que diga que uma falha causa um commit.
O SQL Server não confirma automaticamente uma transação explícita.
O que pode estar acontecendo no seu caso é que a transação é abortada e revertida, mas seu script continua, executando o restante sem uma transação de encapsulamento. Isso é particularmente provável se você tiver
GO
instruções em seu script.Para implementar o tratamento de erros de lote cruzado, você pode fazer algo assim: