web-dev-qa-db-fra.com

Comment restaurer après une mauvaise déclaration de mise à jour dans le serveur SQL 2008R2?

select * from aa

update aa set City='chennai',LastName='vinoth';

ID  FirstName  LastName  City
29  Abcrdrr    vinoth    chennai
1   John       vinoth    chennai
2   Joe        vinoth    chennai
35  raja       vinoth    chennai
38  Johsdfgn   vinoth    chennai

J'ai mal mis à jour Lastname, City colonnes dans toutes les lignes. Maintenant, je veux revenir aux anciennes lignes du tableau.

Utilisation de SQL-Server 2008R2.

5
Vinoth _S

Sauf si vous avez une sorte de table d'historique et de déclencheur en place, pour conserver les anciennes valeurs à chaque changement, ou si vous avez fait une copie de la table avant d'exécuter la mise à jour, vous devrez utiliser la dernière sauvegarde qui a été prise avant cette mise à jour. Restaurez-le (comme une base de données temporaire) et extrayez les données.
Vous disposez d'une sauvegarde, non?

BTW, la prochaine fois que vous effectuez une mise à jour, je vous suggère de l'installer comme ceci:

SELECT *
-- UPDATE t SET Column1 = x, Column2 = y
FROM MyTable AS t
WHERE ...

Exécutez d'abord le SELECT pour voir exactement quelles lignes seront mises à jour. Si nécessaire, ajustez la clause WHERE pour obtenir les lignes que vous souhaitez cibler. Ensuite, marquez la phrase de UPDATE jusqu'à la fin et exécutez-la. Il est beaucoup plus sûr d'exécuter une mise à jour "aveugle", comme vous l'avez fait, en oubliant la clause WHERE (je suppose que c'était le problème).
Encore plus sûr - faites-le d'abord sur une base de données de test :).

16
Blaž Dakskobler

Une autre approche consisterait à utiliser fn_dblog pour vérifier dans les journaux de transactions. C'est un sujet avancé et silencieux, donc je vous renvoie à un excellent article Comment lire et interpréter le journal SQL Server - par Remus Rusan

Pour éviter à l'avenir, vous pouvez toujours utiliser les transactions

BEGIN TRAN
BEGIN TRY
  update tbl set City='chennai',LastName='vinoth' from aa AS tbl;

  -- if update is what you want then
  COMMIT TRAN
END TRY
BEGIN CATCH
  -- if NOT then
  IF @@TRANCOUNT > 0
      ROLLBACK
  THROW
END CATCH

Edit: lors de l'écriture de T-SQL complexe, vous devez utiliser un TRY-CATCH bloquez avec TRANSACTION afin de ne pas verrouiller les ressources si une exception se produit ou si la requête est annulée. Sinon, si la requête n'est pas complexe, il est préférable de ne pas utiliser de transactions.

De plus, comme l'a mentionné Blaz, il est toujours bon de prendre une sauvegarde de la base de données ou simplement de la table avant d'apporter des modifications à la base de données.

13
Kin Shah