这是否可以在不恢复整个数据库的情况下实现?
我做了一些我想要撤消的更改,但没有让数据库脱机,并进行完全恢复。
答案 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数据的日志,并且为了读取它们,您应该拥有高效的工具事件日志分析器。