如何回滚UPDATE语句?

时间:2014-02-03 02:15:42

标签: sql-server database

这是否可以在不恢复整个数据库的情况下实现?

我做了一些我想要撤消的更改,但没有让数据库脱机,并进行完全恢复。

5 个答案:

答案 0 :(得分:4)

简短的回答是:否。

但是,您不必让数据库脱机以对一个或多个表执行部分还原。

您可以将备份还原到单独的数据库,然后使用TSQL查询还原受更新负面影响的行。这可以在主数据库联机时进行。

有关将数据库还原到新位置的详细信息: http://technet.microsoft.com/en-us/library/ms186390.aspx


根据我的评论,以供将来参考

最好使用TRANSACTION

-- Execute a transaction statement before doing an update. 
BEGIN TRANSACTION 
... < your update code >

如果更新错误或产生不良后果,您可以ROLLBACK TRANSACTION

-- Ooops I screwed up! Let's rollback!
--ROLLBACK TRANSACTION -- I have this commented out and then just select the command when needed. This helps to not accidentally rollback if you just press CTRL+E, (or F5 in SSMS 2012)

......它消失了:)

如果一切顺利,只需COMMIT TRANSACTION

-- COMMIT TRANSACTION -- commented out, see above

或者您为所有用户锁定数据库! 所以不要忘记承诺!

答案 1 :(得分:3)

不,SQL Server没有Ctrl + Z。

通过将所有DML语句包装在事务中,可以保护自己免受此情况的影响。所以你有这个查询窗口:

BEGIN TRANSACTION;
UDPATE ...

-- COMMIT TRANSACTION;
-- ROLLBACK TRANSACTION;

运行更新时,请验证是否更新了正确的行数,正确的行,正确的方法等。然后突出显示提交或回滚,具体取决于您是否正确执行了更新。

另一方面,要小心这一点,因为它可能会弄乱你的另一种方式 - 开始交易,忘记提交或回滚,然后出去吃午饭,离开一天,去度假,等等。

不幸的是,这只会帮助你前进。在当前场景中,最简单的路径是恢复数据库的副本,并从该副本中获取数据(您不需要完全覆盖当前数据库以进行恢复受此次更新影响的数据。)

答案 2 :(得分:3)

是的,除了进行完全还原之外,还有第三方工具提供的可行解决方案,该工具从数据库事务日志中读取信息,解析它,然后创建撤消T-SQL脚本以回滚用户操作< / p>

查看 How to recover SQL Server data from accidental updates without backups 在线文章了解详情。本文主要关注UPDATE操作,但通过适当的设置和过滤器,您可以回滚事务日志中记录的任何其他数据库更改

免责声明:我在ApexSQL担任产品支持工程师

答案 3 :(得分:1)

除非您正确地对数据进行版本调整或进行恢复,否则无法实现。

答案 4 :(得分:0)

可能,但需要付出很多努力。

SQL Server以不可读的格式维护DELETED / UPDATED / INSERTED数据的日志,并且为了读取它们,您应该拥有高效的工具事件日志分析器。