Sql 如何回滚隐式SSMS事务(结尾带有go的语句)?
问题:Sql 如何回滚隐式SSMS事务(结尾带有go的语句)?,sql,sql-server,sql-server-2008,transactions,ssms,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(注意末尾的go)中,忘记指定WHERE
通常,可以使用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(注意末尾的go)中,忘记指定WHERE子句,
是否可能(以及如何)回滚SSMS在其中执行此命令的隐式事务(在事务中隐式执行结尾带有go的语句)
注:我没有这样做,但我的一位同事几天前(未经批准)这样做了。
我解开了他造成的伤害(幸运的是,我在他做那件事之前0.5小时做了一次备份),但对于未来来说,知道这件事会很好,因为这件事也曾发生在我身上。不,你不能,不容易。从备份恢复是最好的选择 请看下面的链接,我想它会对您有所帮助 谢谢
Arun不指定隐式事务的结束,而是指定批处理的结束。这就是为什么在
GO
之后,您(不幸地)无法回滚您的更新
从打开的转到:
GO不是Transact-SQL语句;这是一个由用户识别的命令
sqlcmd和osql实用程序以及sqlserver管理工作室代码
编辑
SQL Server实用程序将GO解释为它们应该发送的信号
SQL实例的当前Transact-SQL语句批
服务器。当前一批语句由所有语句组成
自上次GO或自临时会话开始后输入,或
如果这是第一次尝试,请编写脚本
如果已指定启用SET implicit_TRANSACTIONS,则UPDATE
命令将仅被视为隐式事务的开始代码>(请参阅)。在这种情况下,许多命令(CREATE
、DELETE
、UPDATE
等)将自动启动一个新的隐式事务,并且在发出ROLLBACK
或COMMIT
之前,该事务不会结束
(有关SQL Server中事务和批处理之间的差异的更多信息,请参见ServerFault上的这个问题:)噢,是同事吗?:)@波迪卢斯卡:xD,真的!我知道更新有多危险,因为大约一年前,包含翻译的表也发生了同样的事情(从我知道以来,根本的问题是这个思维过程:这只是一个更新,可能会出错……)您始终可以自定义默认SSMS新查询模板,以包括begin tran;回滚事务
True,OP显然意味着自动提交事务。隐式事务不会自动提交。是的,您可以。但事实并非如此;)