it-swarm.com.de

Wie kann ich nach einer falschen Update-Anweisung in SQL Server 2008R2 ein Rollback durchführen?

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

Ich habe die Spalten Lastname, City In allen Zeilen falsch aktualisiert. Jetzt möchte ich zu den alten Tabellenzeilen zurückkehren.

Verwenden von SQL-Server 2008R2.

5
Vinoth _S

Sofern Sie nicht über eine Verlaufstabelle und einen Auslöser verfügen, um alte Werte bei jeder Änderung beizubehalten, oder eine Kopie der Tabelle erstellt haben, bevor Sie das Update ausgeführt haben, müssen Sie das letzte Backup verwenden das wurde vor diesem Update genommen. Stellen Sie es wieder her (als temporäre Datenbank) und extrahieren Sie die Daten.
Sie haben ein Backup zur Verfügung, oder?

Übrigens, wenn Sie das nächste Mal ein Update durchführen, sollten Sie es folgendermaßen einrichten:

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

Führen Sie zuerst SELECT aus, um genau zu sehen, welche Zeilen aktualisiert werden. Passen Sie bei Bedarf die Klausel WHERE an, um die Zeilen abzurufen, auf die Sie abzielen möchten. Erst dann markieren Sie den Satz vom UPDATE bis zum Ende und führen ihn aus. Viel sicherer als ein "blindes" Update auszuführen, wie Sie es getan haben, wobei die WHERE -Klausel vergessen wurde (ich nehme an, das war das Problem).
Noch sicherer - machen Sie es zuerst in einer Testdatenbank :).

16

Ein anderer Ansatz wäre, fn_dblog Zum Überprüfen in Transaktionsprotokollen zu verwenden. Das ist ein ruhiges fortgeschrittenes Thema, daher würde auf einen ausgezeichneten Artikel verwiesen Lesen und Interpretieren des SQL Server-Protokolls - von Remus Rusan

Um dies in Zukunft zu vermeiden, können Sie immer Transaktionen verwenden

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

Bearbeiten: Wenn Sie komplexes T-SQL schreiben, sollten Sie einen TRY-CATCH - Block mit TRANSACTION verwenden, damit Sie keine Ressourcen sperren, wenn eine Ausnahme auftritt oder die Abfrage abgebrochen wird. Andernfalls ist es am besten, keine Transaktionen zu verwenden, wenn die Abfrage nicht komplex ist.

Wie Blaz bereits erwähnt hat, ist es immer gut, eine Sicherungskopie der Datenbank oder nur der Tabelle zu erstellen, bevor Änderungen an der Datenbank vorgenommen werden.

13
Kin Shah