SQL Server 2005でUPDATEクエリをロールバックするにはどうすればよいですか?
コードではなく、SQLでこれを行う必要があります。
begin transaction
// execute SQL code here
rollback transaction
既にクエリを実行しており、それをロールバックしたい場合、残念ながら唯一の本当の選択肢はデータベースのバックアップを復元することです。完全バックアップを使用している場合、特定の時点にデータベースを復元できるはずです。
このツールが必要で、トランザクションを見つけて元に戻すことができます。
このために暗黙のトランザクションを使用できます
SET IMPLICIT_TRANSACTIONS ON
update Staff set staff_Name='jas' where staff_id=7
ROLLBACK
リクエストに応じて、この設定を設定できます(SET IMPLICIT_TRANSACTIONS ON
)ストアドプロシージャから、そのストアドプロシージャを起動プロシージャとして設定します。
だが SET IMPLICIT TRANSACTION ON
コマンドは接続固有です。そのため、スタートアップストアドプロシージャを実行する接続以外の接続は、設定した設定の恩恵を受けません。
トランザクション内で実行したステートメントをロールバックできます。トランザクションをコミットする代わりに、トランザクションをロールバックします。
何かを更新し、それらの更新をロールバックしたい場合、(まだコミットされていない)トランザクション内でこれを行っていない場合は、幸運だと思います...
(手動で修復、またはバックアップを復元)
更新がコミットされると、単一の更新のみをロールバックすることはできません。最善の策は、データベースの以前のバックアップにロールバックすることです。
簡単に:
ヘッダーコード...
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
...
指定した情報から、データベースをバックアップすることで回復することができます。明らかにトランザクションを使用していないため、プッシュした変更をロールバックできるとは思いません。
既に述べたように、バックアップからの復元以外にできることはありません。少なくとも今は、トランザクションにステートメントを常にラップして、コミットする前に何が起こるかを確認する方法を学びました。また、データベースのバックアップがない場合は、データベースの定期的なバックアップを作成することも教えてくれます。
すぐに問題が解決することはあまりありませんが...これらの回答により、今後この問題に遭遇することはありません。
この例では、クエリに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