Ho uno script TSQL che esegue molti aggiustamenti della struttura del database ma non è sicuro lasciarlo passare solo quando qualcosa non funziona.Esci e ripristina tutto nello script sull'errore
di fare chiarezza:
- utilizza MS SQL 2005
- Non è una stored procedure, solo un file di script (sql)
Quello che ho è qualcosa nel seguente ordine
BEGIN TRANSACTION
ALTER Stuff
GO
CREATE New Stuff
GO
DROP Old Stuff
GO
IF @@ERROR != 0
BEGIN
PRINT 'Errors Found ... Rolling back'
ROLLBACK TRANSACTION
RETURN
END
ELSE
PRINT 'No Errors ... Committing changes'
COMMIT TRANSACTION
solo per illustrare ciò con cui sto lavorando ... non posso andare in specifiche ora, il problema ...
Quando introduco un errore (per verificare se le cose vengono ripristinate), ottengo una dichiarazione che la ROLLBACK TRANSACTION non è stata in grado di trovare una corrispondente TRANSAZIONE INIZIALE. Questo mi porta a credere che qualcosa sia DAVVERO sbagliato e che la transazione sia già stata uccisa. quello che ho notato è che lo script non si è completamente chiuso per errore e quindi ho cercato di eseguire ogni istruzione dopo che si è verificato l'errore. (L'ho notato quando si presentavano nuovi tavoli quando non li aspettavo perché avrebbe dovuto eseguire il rollback)
questo è fondamentalmente quello che ho usato, ma nella forma seguente: se @@ errore <> 0 o @@ TRANCOUNT = 0 iniziare \t \t se @@ TRANCOUNT> 0 rollback della transazione \t \t set noexec su \t fine –
'on' noexec set è un trucco, devono ricordare che. – Blorgbeard
Funziona con transazioni a livello di server come 'DROP LOGIN'? Voglio cambiare il dominio a cui appartiene un login e sto rilasciandolo da tutti i DB, ma ho bisogno di ricrearlo assicurandomi che NULLA venga eliminato se non OGNI transazione ha successo con successo. Ciò comporterebbe autorizzazioni non mappate, ecc. E sarebbe una catastrofe. – Chiramisu