Sto scrivendo uno script che cancellerà i record da un certo numero di tabelle, ma prima che lo cancellino deve restituire un conteggio che un utente deve confermare prima di impegnarsi.TSQL Try/Catch in Transaction o viceversa?
Questo è un riepilogo della sceneggiatura.
BEGIN TRANSACTION SCHEDULEDELETE
BEGIN TRY
DELETE -- delete commands full SQL cut out
DELETE -- delete commands full SQL cut out
DELETE -- delete commands full SQL cut out
PRINT 'X rows deleted. Please commit or rollback.' --calculation cut out.
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage
ROLLBACK TRANSACTION SCHEDULEDELETE
PRINT 'Error detected, all changes reversed.'
END CATCH
--COMMIT TRANSACTION SCHEDULEDELETE --Run this if count correct.
--ROLLBACK TRANSACTION SCHEDULEDELETE --Run this if there is any doubt whatsoever.
Questa transazione è la mia prima volta che scrivo, è corretto/pratica migliore per avere il blocco try/catch all'interno della transazione o dovrebbe essere la transazione all'interno del blocco try?
Il fattore importante in questo script è che l'utente deve eseguire manualmente il commit della transazione.
Yup al di fuori del blocco try/catch. – cyan
Non attendere mai che un utente finale esegua il commit della transazione, a meno che non si tratti di un database in modalità utente singolo. – dean
@dean C'è un problema con questo? Fondamentalmente, verrà detto all'utente che dovrebbero aspettarsi il numero X di record cancellati e di impegnarsi subito se il numero corrisponde. Queste tabelle non verranno scritte mentre la transazione è in esecuzione (anche se altre tabelle saranno). – Devasta