Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

TSQL Try / Catch dans Transaction ou vice versa ?

N'ouvrez une transaction qu'une fois que vous êtes dans le TRY block et juste avant l'instruction proprement dite, et validez-la immédiatement. N'attendez pas que votre commande aille en fin de lot pour valider vos transactions.

Si quelque chose ne va pas pendant que vous êtes dans le TRY bloc et que vous avez ouvert une transaction, le contrôle passera au CATCH bloc. Il vous suffit d'annuler votre transaction et de gérer les autres erreurs si nécessaire.

J'ai ajouté un petit chèque pour toute transaction ouverte en utilisant @@TRANCOUNT fonction avant de réellement annuler la transaction. Cela n'a pas vraiment de sens dans ce scénario. Il est plus utile lorsque vous effectuez des vérifications de validation dans votre TRY bloquer avant d'ouvrir une transaction comme vérifier les valeurs des paramètres et d'autres éléments et générer une erreur dans le TRY bloquer si l'un des contrôles de validation échoue. Dans ce cas, le contrôle sautera au CATCH bloquer sans même ouvrir une transaction. Là, vous pouvez vérifier toute transaction ouverte et annuler s'il y en a. Dans votre cas, vous n'avez vraiment pas besoin de vérifier les transactions ouvertes car vous n'entrerez pas le CATCH bloquer sauf si quelque chose ne va pas dans votre transaction.

Ne demandez pas après avoir exécuté le DELETE opération si elle doit être validée ou annulée ; faites toutes ces validations avant d'ouvrir la transaction. Une fois qu'une transaction est ouverte, validez-la immédiatement et en cas d'erreur, gérez les erreurs (vous faites du bon travail en obtenant des informations détaillées en utilisant presque toutes les fonctions d'erreur).

BEGIN TRY

  BEGIN TRANSACTION SCHEDULEDELETE
    DELETE   -- delete commands full SQL cut out
    DELETE   -- delete commands full SQL cut out
    DELETE   -- delete commands full SQL cut out
 COMMIT TRANSACTION SCHEDULEDELETE
    PRINT 'X rows deleted. Operation Successful Tara.' --calculation cut out.
END TRY

BEGIN CATCH 
  IF (@@TRANCOUNT > 0)
   BEGIN
      ROLLBACK TRANSACTION SCHEDULEDELETE
      PRINT 'Error detected, all changes reversed'
   END 
    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
END CATCH