21

如何在 SQL Server 2005 中回滚 UPDATE 查询?

我需要在 SQL 中执行此操作,而不是通过代码。

4

10 回答 10

34
begin transaction

// execute SQL code here

rollback transaction

如果您已经执行了查询并想要回滚它,那么不幸的是,您唯一真正的选择是恢复数据库备份。如果您使用的是完整备份,那么您应该能够将数据库恢复到特定的时间点。

于 2009-04-06T13:38:46.480 回答
29

你需要这个工具,你可以找到交易并撤销它。

ApexSQL 日志

于 2009-04-06T13:46:52.450 回答
6

您可以为此使用隐式事务

SET IMPLICIT_TRANSACTIONS ON

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

ROLLBACK

根据您的要求 - 您可以SET IMPLICIT_TRANSACTIONS ON通过将该存储过程设置为启动过程来从存储过程中设置此设置 ( )。

但是SET IMPLICIT TRANSACTION ON命令是特定于连接的。因此,除了运行启动存储过程的连接之外的任何连接都不会从您设置的设置中受益。

于 2014-01-30T07:49:33.820 回答
5

您可以回滚您在事务中执行的语句。与其提交事务,不如回滚事务。

如果您更新了某些内容并想要回滚这些更新,并且您还没有在(尚未提交的)事务中完成此操作,那么我认为这是运气......

(手动修复或恢复备份)

于 2009-04-06T13:38:37.773 回答
1

提交更新后,您不能只回滚单个更新。最好的办法是回滚到数据库的先前备份。

于 2009-04-06T13:40:29.580 回答
1

根据您指定的信息,您最好的恢复机会是通过数据库备份。我认为您将无法回滚您推动的任何更改,因为您当时显然没有使用事务。

于 2009-04-06T13:41:05.617 回答
1

做起来很简单:

标题代码...

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

...

于 2013-01-09T17:53:59.930 回答
0

如前所述,除了从备份恢复之外,您无能为力。至少现在您将学会始终将语句包装在事务中,以查看在您决定提交之前会发生什么。此外,如果您没有数据库备份,这也将教您定期备份数据库。

虽然我们对您的直接问题没有太大帮助......但希望这些答案将确保您将来不会再次遇到这个问题。

于 2009-04-06T13:50:19.477 回答
0

在此示例中,我们在查询中运行 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
于 2018-01-04T11:53:27.207 回答
-3

尝试

ROLLBACK WORK;

它通常有效

于 2012-07-31T02:20:30.610 回答