Comment puis-je annuler une requête UPDATE dans SQL Server 2005?
J'ai besoin de le faire en SQL, pas avec du code.
begin transaction
// execute SQL code here
rollback transaction
Si vous avez déjà exécuté la requête et souhaitez la restaurer, votre seule option réelle est malheureusement de restaurer une sauvegarde de base de données. Si vous utilisez des sauvegardes complètes, vous devriez pouvoir restaurer la base de données à un moment donné.
Vous avez besoin de cet outil et vous pouvez trouver la transaction et l’inverser.
Vous pouvez utiliser transactions implicites pour cela
SET IMPLICIT_TRANSACTIONS ON
update Staff set staff_Name='jas' where staff_id=7
ROLLBACK
Lorsque vous le demandez, vous pouvez CONFIGURER ce paramètre (SET IMPLICIT_TRANSACTIONS ON
) à partir d'une procédure stockée en définissant cette procédure stockée comme procédure de démarrage.
Mais la commande SET IMPLICIT TRANSACTION ON
est spécifique à la connexion. Ainsi, toute connexion autre que celle exécutant la procédure stockée de démarrage ne bénéficiera pas du paramètre que vous avez défini.
Vous pouvez annuler les instructions que vous avez exécutées dans une transaction ..__ Au lieu de valider la transaction, annulez la transaction.
Si vous avez mis à jour quelque chose et que vous voulez annuler ces mises à jour, et que vous ne l'avez pas fait dans une transaction (non encore validée), alors je pense que c'est par hasard ...
(Réparer ou restaurer manuellement les sauvegardes)
Une fois qu'une mise à jour est validée, vous ne pouvez plus annuler une seule mise à jour. Votre meilleur choix est de revenir à une sauvegarde précédente de la base de données.
Simple à faire:
code d'en-tête ...
Set objMyConn = New ADODB.Connection
Set objMyCmd = New ADODB.Command Set
objMyRecordset = New ADODB.Recordset
On Error GoTo ERRORHAND
Code de travail ...
objMyConn.ConnectionString = ConnStr
objMyConn.Open
code....
'Copier les données à partir d'Excel'
objMyConn.BeginTrans <-- define transactions to possible be rolled back
For NewRows = 2 To Rows
objMyRecordset.AddNew
For NewColumns = 0 To Columns - 1
objMyRecordset.Fields(NewColumns).Value = ActiveSheet.Cells(NewRows, NewColumns + 1)
Next NewColumns objMyRecordset.Update Next NewRows
objMyConn.CommitTrans <- if success, commit them to DB
objMyConn.Close
ERRORHAND:
Success = False
objMyConn.RollbackTrans <-- here we roll back if error encountered somewhere
LogMessage = "ERROR writing database: " & Err.Description
...
Parmi les informations que vous avez spécifiées, votre meilleure chance de récupération réside dans une sauvegarde de base de données. Je ne pense pas que vous serez en mesure d’annuler l’un quelconque des changements que vous avez mis en place puisque vous n’utilisiez apparemment pas de transactions à l’époque.
Comme déjà indiqué, vous ne pouvez rien faire à part restaurer à partir d’une sauvegarde. Au moins maintenant, vous aurez appris à envelopper les instructions dans une transaction pour voir ce qui se passe avant de décider de valider. En outre, si vous ne possédez pas de sauvegarde de votre base de données, vous apprendrez également à effectuer des sauvegardes régulières de votre base de données.
Bien que nous n'ayons pas beaucoup aidé pour votre problème immédiat ... espérons que ces réponses vous éviteront de vous retrouver dans ce problème à l'avenir.
dans cet exemple, nous exécutons une insertion de 2 lignes dans une requête et si toutes les réponses sont vraies, elles sont exécutées, mais sinon aucune exécution et ROLLBACK
DECLARE @rowcount int set @rowcount = 0 ;
BEGIN TRANSACTION [Tran1]
BEGIN TRY
insert into [database].[dbo].[tbl1] (fld1) values('1') ;
set @rowcount = (@rowcount + @@ROWCOUNT);
insert into [database].[dbo].[tbl2] (fld1) values('2') ;
set @rowcount = (@rowcount + @@ROWCOUNT);
IF @rowcount = 2
COMMIT TRANSACTION[Tran1]
ELSE
ROLLBACK TRANSACTION[Tran1]
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION[Tran1]
END CATCH