【问题标题】:How to rollback an implicit SSMS transaction (statement with go at the end)?如何回滚隐式 SSMS 事务(最后带有 go 的语句)?
【发布时间】:2012-08-24 08:31:03
【问题描述】:

问题:
通常,您可以通过回滚来撤消 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 小时做了备份),但对于未来,知道这一点会很好,因为这也发生在我身上。

【问题讨论】:

  • 哦,同事,是吗? :)
  • @podiluska: xD 真的是这样!我知道更新有多危险,因为大约一年前,同样的事情发生在我身上,包含翻译的表格(自从我知道,根本问题是这个思考过程:它只是一个更新,可能会出错。 ..) ;)
  • 您始终可以自定义默认的 SSMS 新查询模板以包含 begin tran; rollback tran

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


【解决方案1】:

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

【讨论】:

  • 是的,你可以。但不容易是真的;)
【解决方案2】:

看下面的链接,我想对你有帮助

How to recover the old data from table

谢谢 阿伦

【讨论】:

    【解决方案3】:

    GO 没有指定隐式事务的结束,而是批处理的结束。这就是为什么在GO 之后你将无法(不幸地)ROLLBACK 你的UPDATE

    来自MSDN pageGO

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

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

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

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

    【讨论】:

    • 没错,OP 显然意味着自动提交事务。隐式事务不会自动提交。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    相关资源
    最近更新 更多