问题:
通常,您可以使用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小时做了备份),但是对于未来,知道这一点会很好,因为这也发生在我身上。
答案 0 :(得分:4)
不,你不能,不容易。从备份恢复是最佳选择。
答案 1 :(得分:2)
答案 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)。在这种情况下,许多命令(CREATE
,DELETE
,UPDATE
等等)将自动启动新的隐式事务,并且在您发出{{1}之前该事务不会结束}或ROLLBACK
。
(有关SQL Server中事务和批处理之间差异的详细信息,请参阅ServerFault上的此问题:SQL Server: Statements vs. Batches vs. Transactions vs. Connections。)