2009-04-06 3 views
17

Wie kann ich eine UPDATE-Abfrage in SQL Server 2005 zurücksetzen?Wie kann ich eine UPDATE-Abfrage in SQL Server 2005 zurücksetzen?

Ich muss dies in SQL tun, nicht durch Code.

+1

was meinst du mit Update? Kannst du etwas näher auf diese Frage eingehen? –

+1

Ich habe eine Tabelle aktualisiert, die mein schrecklicher Fehler war ... anstatt die Zeile zu aktualisieren..mit meiner Sorglosigkeit habe ich alle Zeilen aktualisiert ... wie bringe ich das zurück .... bitte helfen Sie ... – Guddu

+1

Sie brauchen ApexSQL-Protokoll. –

Antwort

5

Sie können die Anweisungen zurücksetzen, die Sie innerhalb einer Transaktion ausgeführt haben. Statt die Transaktion zu committen, setzen Sie die Transaktion zurück.

Wenn Sie etwas aktualisiert haben und die Updates Rollback mögen, und Sie haben dies nicht in einer (noch nicht verpflichtet) Transaktion durchgeführt, dann denke ich, es ist allerdings Glück ... reparieren

(Manuell wiederherstellen oder Backups)

30
begin transaction 

// execute SQL code here 

rollback transaction 

Wenn Sie bereits die Abfrage ausgeführt haben, und will es zurück rollen, leider Ihre einzige wirkliche Option ist eine Datenbanksicherung wiederherzustellen. Wenn Sie vollständige Sicherungen verwenden, sollten Sie die Datenbank zu einem bestimmten Zeitpunkt wiederherstellen können.

+1

Was meinst du mit Full Backups, sollte ich die Datenbank täglich sichern, ich bin neu dazu? – stom

1

Sobald ein Update festgeschrieben wurde, können Sie nicht nur das einzelne Update zurücksetzen. Am besten ist es, zu einer vorherigen Sicherung der Datenbank zurückzukehren.

1

Anhand der von Ihnen angegebenen Informationen besteht die beste Wiederherstellungschance in einer Datenbanksicherung. Ich glaube nicht, dass Sie in der Lage sein werden, eine dieser Änderungen rückgängig zu machen, die Sie durchgeführt haben, da Sie zu diesem Zeitpunkt offenbar keine Transaktionen verwendet haben.

28

Sie benötigen dieses Tool und Sie können die Transaktion finden und umgekehrt.

ApexSQL Log

+1

"Hoppla - möchten, dass Sie diese Update-Anweisung ohne eine Where-Klausel zurücksetzen können? ApexSQL Log kann Transaktionen für SQL Server-Datenbanken ROLLBACK durchführen." Tolle Linie! –

+2

diese Maut scheint gut, aber es kostet 2000 $ –

0

Wie bereits festgestellt, gibt es nichts, was man außer für Wiederherstellungen aus einer Sicherung zu tun. Zumindest werden Sie jetzt gelernt haben, Anweisungen immer in eine Transaktion zu verpacken, um zu sehen, was passiert, bevor Sie sich für einen Commit entscheiden. Wenn Sie keine Sicherungskopie Ihrer Datenbank haben, lernen Sie auch, regelmäßige Sicherungskopien Ihrer Datenbank zu erstellen.

Wir waren zwar nicht viel Hilfe für Ihr sofortiges Problem ... aber hoffentlich werden diese Antworten dafür sorgen, dass Sie dieses Problem in Zukunft nicht noch einmal lösen werden.

-3

ROLLBACK WORK; 

Versuchen Sie arbeitet in der Regel

1

Einfach zu tun:

Code

header ... Code

Set objMyConn = New ADODB.Connection 

Set objMyCmd = New ADODB.Command Set 

objMyRecordset = New ADODB.Recordset 

On Error GoTo ERRORHAND 

Arbeiten ...

objMyConn.ConnectionString = ConnStr 

objMyConn.Open 

Code ....

'Kopieren von Daten aus 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 

...

6

können Sie implizite Transaktionen für dieses

SET IMPLICIT_TRANSACTIONS ON 

update Staff set staff_Name='jas' where staff_id=7 

ROLLBACK 

verwenden, wie Sie Sie request-- diese Einstellung festlegen können (SET IMPLICIT_TRANSACTIONS ON) aus einer gespeicherten Prozedur durch, dass die gespeicherte Prozedur als Startprozedur einstellen.

Aber SET IMPLICIT TRANSACTION ON Befehl ist verbindungsspezifisch. Daher wird jede andere Verbindung als die, auf der die gespeicherte Startprozedur ausgeführt wird, nicht von der von Ihnen festgelegten Einstellung profitieren.

0

in diesem Beispiel führen wir 2 Zeilen in Abfrage einfügen und wenn sie alle wahr es laufen, aber wenn nicht nicht lief nichts und 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 
Verwandte Themen