SQL Server 2005에서 업데이트 쿼리를 롤백하려면 어떻게해야합니까?
-
05-09-2019 - |
문제
SQL Server 2005에서 업데이트 쿼리를 롤백하려면 어떻게해야합니까?
코드를 통해서가 아니라 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
명령은 연결 특정입니다. 따라서 Start Up 저장 프로 시저를 실행하는 것 이외의 연결은 설정 한 설정의 이점이 없습니다.
거래 내에서 실행 된 진술을 롤백 할 수 있습니다. 거래를 촉구하는 대신 거래를 롤백하십시오.
당신이 무언가를 업데이트하고 그 업데이트를 롤백하고 싶다면, 당신은 (아직 기념적으로 구성되지 않은) 거래 내부 에서이 작업을 수행하지 않았다면 운이 좋다고 생각합니다 ...
(수성 수리 또는 백업 복원)
업데이트가 커지면 단일 업데이트 만 롤백 할 수 없습니다. 가장 좋은 방법은 데이터베이스의 이전 백업으로 롤백하는 것입니다.
지정한 정보에서 가장 좋은 복구 가능성은 데이터베이스 백업을 통한 것입니다. 나는 당신이 당시 거래를 사용하지 않았기 때문에 당신이 추진 한 변경 사항을 롤백 할 수있을 것이라고 생각하지 않습니다.
할 일 :
헤더 코드 ...
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 라인 삽입을 쿼리로 실행하고 모두 사실이면 실행되지만 실행이 없다면 아무것도 실행하지 않고 롤백합니다.
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
노력하다
ROLLBACK WORK;
일반적으로 작동합니다