web-dev-qa-db-fra.com

Comment annuler une requête UPDATE SQL Server?

Dans SQL Server Management Studio, j'ai fait la requête ci-dessous.
Malheureusement, j'ai oublié de décommenter la clause WHERE.
1647 lignes ont été mises à jour au lieu de 4.

Comment annuler la dernière instruction?

Malheureusement, je viens juste de terminer la traduction de ces 1647 lignes et je faisais les dernières corrections , et n'ont donc pas de sauvegarde.

UPDATE [dbo].[T_Language]
   SET 
       [LANG_DE] = 'Mietvertrag' --<LANG_DE, varchar(255),>
      ,[LANG_FR] = 'Contrat de bail' -- <LANG_FR, varchar(255),>
      ,[LANG_IT] = 'Contratto di locazione' -- <LANG_IT, varchar(255),>      
      ,[LANG_EN] = 'Tenancy agreement' -- <LANG_EN, varchar(255),>
       --WHERE [LANG_DE] like 'Mietvertrag'

Il existe un protocole de transaction, du moins je l'espère.

23
Stefan Steiger

Une transaction non validée peut être annulée en émettant la commande ROLLBACK

Mais si vous utilisez le mode de validation automatique, vous ne pouvez rien faire ...

13

Si vous avez déjà une sauvegarde complète de votre base de données, heureusement, vous avez une option dans SQL Management Studio. Dans ce cas, vous pouvez utiliser les étapes suivantes:

  1. Faites un clic droit sur la base de données -> Tâches -> Restaurer -> Base de données.

  2. Dans l'onglet Général, cliquez sur Chronologie -> sélectionnez l'option Date et heure spécifiques.

  3. Déplacez le curseur de la chronologie avant l'heure de la commande de mise à jour -> cliquez sur OK.

  4. Dans le nom de la base de données de destination, saisissez un nouveau nom.

  5. Dans l'onglet Fichiers, activez Réallouer tous les fichiers dans le dossier, puis sélectionnez un nouveau chemin pour enregistrer votre base de données récupérée.

  6. Dans l'onglet Options, cochez la case Remplacer ... et supprimez l'option de vérification Prendre le journal de fin ...

  7. Enfin, cliquez sur OK et attendez la fin du processus de récupération.

J'ai moi-même utilisé cette méthode dans une base de données opérationnelle et c'était très utile.

10
Newbi

Étant donné que vous disposez déjà d'une sauvegarde complète, je voudrais simplement restaurer cette sauvegarde dans une base de données distincte et migrer les données à partir de là.

Si vos données ont changé après la dernière sauvegarde, vous récupérez toutes les données de cette façon, mais vous pouvez essayer de les récupérer en lisant le journal des transactions.

Si votre base de données était en mode de récupération complète, le journal des transactions contient suffisamment de détails pour récupérer les mises à jour de vos données après la dernière sauvegarde.

Vous voudrez peut-être essayer avec DBCC LOG, les fonctions fn_log ou avec un lecteur de journaux tiers tel que ApexSQL Log

Malheureusement, il n'y a pas de moyen facile de lire le journal des transactions car MS ne fournit pas de documentation à ce sujet et stocke les données dans son format propriétaire.

5
Frank Baker

Si vous pouvez détecter cela à temps et que vous n'avez pas la possibilité de ROLLBACK ou d'utiliser le journal des transactions, vous pouvez effectuer une sauvegarde immédiatement et utiliser un outil comme Comparaison des données SQL de Redgate pour générer un script pour "restaurer" les données affectées. Cela a fonctionné comme un charme pour moi. :)

0
Will Strohl

Étant donné que vous disposez d'une sauvegarde COMPLÈTE, vous pouvez restaurer la sauvegarde sur un serveur différent en tant que base de données du même nom ou sur le même serveur avec un nom différent.

Ensuite, vous pouvez simplement revoir le contenu avant la mise à jour et écrire un script SQL pour effectuer la mise à jour.

0
Raj More