2012-08-24 2 views
3

Question:
Normalement, vous pouvez annuler une commande sql avec restauration.Comment faire pour annuler une transaction SSMS implicite (déclaration avec aller à la fin)?

BEGIN TRY 
    BEGIN TRANSACTION 
    /* run all your SQL statements */ 
    COMMIT TRANSACTION 
END TRY 
BEGIN CATCH 
    ROLLBACK TRANSACTION 
END CATCH 

Ma question maintenant:
Si 'un' a fait ce

UPDATE TABLE_X SET FIELD_X = 'bla' 
GO 

dans SSMS (avis en déplacement à la fin) et a oublié de préciser la clause WHERE, est -il possible (et comment) d'annuler la transaction implicite que SSMS a exécutée dans cette commande (les instructions avec go à la fin sont implicitement exécutées dans une transaction)?

Note:
Je ne le faisais pas, mais un de mes collègues a fait il y a quelques jours (sans aller).
J'ai défait les dégâts qu'il a subis (heureusement j'ai fait une sauvegarde 0,5 heure avant de faire ça), mais pour le futur, ça serait bien de le savoir, parce que ça m'est arrivé une fois aussi.

+6

Oh, un collègue, at-il été?:) – podiluska

+1

@podiluska: xD C'était vraiment! Je sais à quel point les mises à jour sont dangereuses, car il y a un an, la même chose m'arrivait avec la table contenant les traductions (depuis que je sais, le problème sous-jacent est ce processus de réflexion. ..);) –

+0

Vous pouvez toujours personnaliser le nouveau modèle de requête SSMS par défaut pour inclure 'begin tran; rollback tran' – podiluska

Répondre

4

Non, vous ne pouvez pas, pas facilement. La restauration à partir de la sauvegarde est la meilleure option.

+1

Oui, vous pouvez. Mais ce n'est pas facile est vrai;) –

0

GO ne précise pas la fin d'une transaction implicite, mais la fin d'un lot. C'est pourquoi vous ne pourrez pas (malheureusement) ROLLBACK votre UPDATE après un GO.

De l'MSDN page sur GO:

GO n'est pas une instruction Transact-SQL; il s'agit d'une commande reconnue par les utilitaires sqlcmd et osql et l'éditeur de code SQL Server Management Studio .

Les utilitaires SQL Server interprètent GO comme un signal qu'ils doivent envoyer le lot actuel d'instructions Transact-SQL à une instance de SQL Server. Le lot d'instructions actuel est composé de toutes les déclarations entrées depuis le dernier GO, ou depuis le début de la session ad hoc ou du script s'il s'agit du premier GO.

La commande UPDATE ne sera considéré comme le début d'une transaction implicite si vous avez spécifié SET IMPLICIT_TRANSACTIONS ON; (voir here). Dans ce cas, un certain nombre de commandes (CREATE, DELETE, UPDATE etcetera) lancera automatiquement une nouvelle transaction implicite, et cette transaction ne se terminera pas avant que vous n'émettiez un ROLLBACK ou un COMMIT.

(Pour plus d'informations sur la différence entre les transactions et les lots dans SQL Server par exemple sur cette question ServerFault. SQL Server: Statements vs. Batches vs. Transactions vs. Connections)

+0

Vrai, l'OP signifie évidemment des transactions de validation automatique. Les transactions implicites n'auraient pas été validées automatiquement. –

Questions connexes