web-dev-qa-db-fra.com

Mise à jour SQL annuler

Existe-t-il un moyen d'annuler une requête de mise à jour SQL?

19
Balaji

Vous ne pouvez pas sauf si vous l'avez exécuté dans un transaction .

En fonction de vos transactions SGBD seront traitées différemment, alors lisez la documentation. Par exemple avec mysql voici comment ça se passe:

START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;

Avec Postresql :

BEGIN;
UPDATE accounts SET balance = balance - 100.00
    WHERE name = 'Alice';
-- etc etc
COMMIT;

Avec TSQL :

DECLARE @TranName VARCHAR(20)
SELECT @TranName = 'MyTransaction'
BEGIN TRANSACTION @TranName
GO
USE pubs
GO
UPDATE roysched
SET royalty = royalty * 1.10
WHERE title_id LIKE 'Pc%'
GO
COMMIT TRANSACTION MyTransaction
GO

Il y a aussi certaines actions qui ne peuvent pas être mises dans une transaction, mais dans la plupart des systèmes de gestion de base de données, vous pouvez trouver de nos jours que vous devriez être capable de restaurer un update.

Enfin, vous pouvez toujours annuler une mise à jour si vous conservez un journal précis de tout ce qui se passe dans la base de données, mais c'est une autre histoire.

18
marcgg

SQL Server ne prend pas cela en charge, mais dans certains cas, il est possible de récupérer des données en lisant le journal des transactions. Cela fonctionne si la base de données était en mode de récupération complète et que des outils tiers tels que ApexSQL Log ou Log Rescue sont nécessaires. Il existe également un moyen de lire t-log à l'aide de la commande DBCC LOG, mais cela s'avérera probablement trop difficile.

Vous pouvez également consulter les rubriques suivantes où cela est discuté:

Comment puis-je restaurer une requête UPDATE dans SQL Server 2005?

Lire le fichier journal (* .LDF) dans SQL Server 2008

6
Ken Williams

Si vous exécutez la mise à jour dans une transaction, vous pouvez annuler la transaction.

Serveur SQL:

begin transaction

update [Table] set col1 = 'test' where Id = 3

rollback transaction

Une autre technique peut consister à ajouter un déclencheur de mise à jour à la table, et chaque fois que l'enregistrement est mis à jour, enregistrez les valeurs précédentes dans une table "historique". Cela peut ou peut ne pas être une bonne idée si ce tableau est largement utilisé.

5
Andy White

L'annulation est appelée rollback dans SQL. Une fois que vous avez fait un commit, vous ne pouvez pas l'annuler sans entrer dans la restauration des sauvegardes.

Notez que faire une restauration annulera une transaction entière, ce qui signifie chaque mise à jour, insertion et suppression depuis le début de la transaction, qui est généralement depuis la dernière validation ou restauration. Cela signifie que si vous effectuez deux mises à jour consécutives, vous ne pouvez pas annuler uniquement la deuxième. Certaines bases de données fournissent des "points de sauvegarde" qui le permettent.

2
Graeme Perrow

Seulement si vous êtes dans une transaction (comme marcgg) l'a dit ou si vous avez une sauvegarde récente ... la récupération de cette façon étire plutôt le terme "annuler".

1
lexu

Vous pouvez utiliser un outil tiers comme Red Gate's Log Rescue . Il existe un essai fonctionnel gratuit de 14 jours de leur boîte à outils SQL. (En supposant que SQL Server 2000!).

0
AdaTheDev