如何回滚隐式SSMS事务(语句结尾处)?

时间:2012-08-24 08:31:03

标签: sql sql-server sql-server-2008 transactions ssms

问题:
通常,您可以使用rollback撤消sql命令。

BEGIN TRY
  BEGIN TRANSACTION
  /* run all your SQL statements */
  COMMIT TRANSACTION
END TRY
BEGIN CATCH
  ROLLBACK TRANSACTION
END CATCH

我现在的问题:
如果有一个'这样做了

UPDATE TABLE_X SET FIELD_X = 'bla'
GO
SSMS 中的

(注意最后的结果)并忘记指定WHERE子句, 是否有可能(以及如何)回滚SSMS执行此命令的隐式事务(在事务中隐式执行go的结尾)?

注意:
我没有这样做,但我的一位同事几天前做过(没有去) 我解除了他所造成的伤害(幸运的是我在他做到这一点之前的0.5小时做了备份),但是对于未来,知道这一点会很好,因为这也发生在我身上。

3 个答案:

答案 0 :(得分:4)

不,你不能,不容易。从备份恢复是最佳选择。

答案 1 :(得分:2)

请参阅下面的链接,我认为它会对您有所帮助

How to recover the old data from table

感谢 阿伦

答案 2 :(得分:1)

GO未指定隐式事务的结束,而是指定批处理的结束。这就是为什么你不能(不幸的是)在ROLLBACK之后UPDATE GO {。}}。

来自GO上的MSDN page

  

GO不是Transact-SQL语句;这是一个被公认的命令   sqlcmd和osql实用程序以及SQL Server Management Studio代码   编辑器。

     

SQL Server实用程序将GO解释为应发送的信号   当前批处理的Transact-SQL语句到SQL的一个实例   服务器。当前批次的陈述由所有陈述组成   自上次GO开始,或自特别会议开始以来或   脚本,如果这是第一个GO。

如果您指定了UPDATE,则SET IMPLICIT_TRANSACTIONS ON;命令将仅被视为隐式事务的开始(请参阅here)。在这种情况下,许多命令(CREATEDELETEUPDATE等等)将自动启动新的隐式事务,并且在您发出{{1}之前该事务不会结束}或ROLLBACK

(有关SQL Server中事务和批处理之间差异的详细信息,请参阅ServerFault上的此问题:SQL Server: Statements vs. Batches vs. Transactions vs. Connections。)