执行UPDATE语句修改表字段值出错后如何进行回滚操作
回滚错误UPDATE操作的解决方案
场景1:执行UPDATE前手动开启了事务,未执行COMMIT操作
直接运行回滚语句即可撤销本次所有更改:
ROLLBACK TRANSACTION;
场景2:事务已自动/手动提交,需恢复更改
SQL Server默认开启自动提交事务,若你执行UPDATE前没有手动开启事务,语句运行完成后会自动提交,无法直接回滚,可通过以下两种方式恢复数据:
- 方法1:从备份恢复
如果你有执行UPDATE之前的数据库完整备份+事务日志备份,可以先将备份还原到临时库,指定还原时间点为UPDATE执行前的时刻,再将[PEA].[pc].[TPC_Participants_Record_STG]表的对应数据同步回原库即可。 - 方法2:从事务日志提取回滚语句
不要对当前数据库执行大量写入操作,避免事务日志被覆盖。可以使用SQL Server自带的fn_dblog函数,或者第三方事务日志分析工具,从事务日志中提取本次UPDATE操作对应的旧值,生成反向更新语句执行即可恢复数据。
注意:事务日志仅保留未被覆盖的操作记录,如果数据库的恢复模式是简单模式,且事务日志已被截断,此方法无效。
后续高危操作建议
之后执行UPDATE、DELETE这类会修改数据的语句前,建议先开启显式事务,确认操作符合预期再提交:
BEGIN TRANSACTION; -- 先执行UPDATE/DELETE语句 update t1 set t1.[DateAdded] = case when t1.[DateAdded] is null then cast(getdate() as date) end from [PEA].[pc].[TPC_Participants_Record_STG] as t1; -- 核对影响行数、更新结果是否符合预期,没问题就提交,有问题就回滚 -- COMMIT TRANSACTION; -- ROLLBACK TRANSACTION;
也可以先写等价的SELECT语句确认要修改的行范围,避免误操作。
内容的提问来源于stack exchange,提问作者Chicken Sandwich No Pickles
相关产品推荐
相关产品推荐

