【问题标题】:How can I rollback an UPDATE query in SQL server 2005?如何在 SQL Server 2005 中回滚 UPDATE 查询?
【发布时间】:2010-10-17 19:31:50
【问题描述】:

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

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

【问题讨论】:

  • 更新是什么意思?你能在这个问题上再深入一点吗?
  • 我更新了一个表,这是我的严重错误..而不是更新单行..我的粗心已经更新了所有行...我如何回滚这个....请帮助。 ....

标签: sql sql-server-2005 sql-update rollback


【解决方案1】:

在这个例子中,我们在查询中运行 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

【讨论】:

    【解决方案2】:

    您可以为此使用隐式事务

    SET IMPLICIT_TRANSACTIONS ON
    
    update Staff set staff_Name='jas' where staff_id=7
    
    ROLLBACK
    

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

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

    【讨论】:

      【解决方案3】:

      简单易做:

      标题代码...

      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
      

      ...

      【讨论】:

        【解决方案4】:

        试试

        ROLLBACK WORK;
        

        它通常有效

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

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

            ApexSQL Log

            【讨论】:

            • “哎呀——希望您可以在没有 where 子句的情况下回滚该 Update 语句!?ApexSQL Log 能够回滚 SQL Server 数据库的事务。”很棒的路线!
            • 收费看起来不错,但花了 2000 美元
            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                【解决方案9】:
                begin transaction
                
                // execute SQL code here
                
                rollback transaction
                

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

                【讨论】:

                • 完整备份是什么意思,我应该每天备份数据库吗?我是新手?
                【解决方案10】:

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

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

                (手动修复,或恢复备份)

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-06-09
                  • 2011-01-25
                  • 2010-09-08
                  • 1970-01-01
                  相关资源
                  最近更新 更多