5

问题:
通常情况下,您可以撤消带有回滚的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中(注意最后的 go)并忘记指定 WHERE 子句,是否有可能(以及如何)回滚 SSMS 在其中执行此命令的隐式事务(最后带有 go 的语句在事务中隐式执行) ?

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

4

3 回答 3

4

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

于 2012-08-24T08:34:47.220 回答
2

看下面的链接,我想它会帮助你

如何从表中恢复旧数据

谢谢阿伦

于 2012-08-24T08:39:23.997 回答
1

GO不指定隐式事务的结束,而是批处理的结束。这就是为什么您将无法(不幸地)ROLLBACK在.UPDATEGO

MSDN 页面GO

GO 不是 Transact-SQL 语句;它是 sqlcmd 和 osql 实用程序以及 SQL Server Management Studio 代码编辑器识别的命令。

SQL Server 实用程序将 GO 解释为它们应该将当前批次的 Transact-SQL 语句发送到 SQL Server 实例的信号。当前批次的语句由自上次 GO 或自特别会话或脚本开始(如果这是第一个 GO)以来输入的所有语句组成。

如果您已指定,该UPDATE命令只会被视为隐式事务的开始SET IMPLICIT_TRANSACTIONS ON;(请参见此处)。在这种情况下,许多命令(CREATEDELETE等)将自动启动一个新的隐式事务,并且该事务在您发出 a或 aUPDATE之前不会结束。ROLLBACKCOMMIT

(有关 SQL Server 中事务和批处理之间的区别的更多信息,请参阅 ServerFault 上的这个问题:SQL Server: Statements vs. Batches vs. Transactions vs. Connections。)

于 2012-08-24T09:43:53.183 回答