web-dev-qa-db-ja.com

SQL Server 2005でUPDATEクエリをロールバックするにはどうすればよいですか?

SQL Server 2005でUPDATEクエリをロールバックするにはどうすればよいですか?

コードではなく、SQLでこれを行う必要があります。

18
Guddu
begin transaction

// execute SQL code here

rollback transaction

既にクエリを実行しており、それをロールバックしたい場合、残念ながら唯一の本当の選択肢はデータベースのバックアップを復元することです。完全バックアップを使用している場合、特定の時点にデータベースを復元できるはずです。

32
Adam Robinson

このツールが必要で、トランザクションを見つけて元に戻すことができます。

ApexSQLログ

28
rick schott

このために暗黙のトランザクションを使用できます

SET IMPLICIT_TRANSACTIONS ON

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

ROLLBACK

リクエストに応じて、この設定を設定できます(SET IMPLICIT_TRANSACTIONS ON)ストアドプロシージャから、そのストアドプロシージャを起動プロシージャとして設定します。

だが SET IMPLICIT TRANSACTION ONコマンドは接続固有です。そのため、スタートアップストアドプロシージャを実行する接続以外の接続は、設定した設定の恩恵を受けません。

6
tarzanbappa

トランザクション内で実行したステートメントをロールバックできます。トランザクションをコミットする代わりに、トランザクションをロールバックします。

何かを更新し、それらの更新をロールバックしたい場合、(まだコミットされていない)トランザクション内でこれを行っていない場合は、幸運だと思います...

(手動で修復、またはバックアップを復元)

5

更新がコミットされると、単一の更新のみをロールバックすることはできません。最善の策は、データベースの以前のバックアップにロールバックすることです。

1
JoshBerke

簡単に:

ヘッダーコード...

Set objMyConn = New ADODB.Connection

Set objMyCmd = New ADODB.Command Set

objMyRecordset = New ADODB.Recordset

On Error GoTo ERRORHAND 

作業コード...

objMyConn.ConnectionString = ConnStr

objMyConn.Open 

コード....

「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

エラーハンド:

Success = False 

objMyConn.RollbackTrans <-- here we roll back if error encountered somewhere

LogMessage = "ERROR writing database: " & Err.Description

...

1
Rick B

指定した情報から、データベースをバックアップすることで回復することができます。明らかにトランザクションを使用していないため、プッシュした変更をロールバックできるとは思いません。

1
TheTXI

既に述べたように、バックアップからの復元以外にできることはありません。少なくとも今は、トランザクションにステートメントを常にラップして、コミットする前に何が起こるかを確認する方法を学びました。また、データベースのバックアップがない場合は、データベースの定期的なバックアップを作成することも教えてくれます。

すぐに問題が解決することはあまりありませんが...これらの回答により、今後この問題に遭遇することはありません。

0
mezoid

この例では、クエリに2行の挿入を実行し、それらのすべてがtrueの場合は実行されますが、実行されない場合は何も実行せず、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