【问题标题】:How to rollback without transaction如何在没有事务的情况下回滚
【发布时间】:2012-09-13 00:54:56
【问题描述】:

我犯了一个大错,我执行了这个查询:

update Contact set ContaPassword = '7FD736A3070CB9766'

我忘记了WHERE 子句,所以它更新了所有用户的密码。 :(

有没有办法可以在此查询之前恢复数据?

【问题讨论】:

  • SQL Server 中没有 Ctrl+Z。
  • 如果有什么安慰的话,我们大多数人在职业生涯的某个阶段都做过类似的事情。请注意对马丁链接到的问题的答案之一给出的建议 - 尽快承认错误
  • 同意@MartinWilson。另外让我告诉你,我知道一些同事更喜欢开始编写更新语句,故意将其格式错误为:U.PDATE WhatEver SET X=Y;,这样如果他们在确定语句正确之前错误地执行查询,则不会执行......无论如何,你仍然是人类,错误是我们本性的一部分......祝你好运,希望你能找到你的数据库的备份!
  • 感谢大家,好消息我们已经备份了数据库。所以毕竟一切都很好:)

标签: sql sql-server-2008 rollback


【解决方案1】:

如果您在 BEGIN TRANSACTION / ROLLBACK 之外运行更改,则无法撤消更改。这就是我开始任何形式的生产数据更新的原因:

BEGIN TRANSACTION

-- report the bad or undesired data condition before-hand
SELECT ...

-- change the data
INSERT/UPDATE/DELETE ...

-- ensure we changed a reasonable number of records; may not be accurate if table has triggers
SELECT @@ROWCOUNT

 -- get the data condition afterwards and be sure it looks good.
SELECT ...

-- always start with this enabled first
ROLLBACK

-- don't do this until you are very sure the change looks good
-- COMMIT

Martin Smith 在这个话题上指出了this excellent post by Brent Ozar on dba.stackexchange.com。在完全恢复模式下,可以检查日志文件以了解发生了什么变化。

此外,正如 Oded 所指出的,如果您有备份,那么恢复原始数据并不难。您可以在某处恢复备份并复制原始数据。

【讨论】:

  • 谢谢你的回答,其实我们每天都备份数据库没问题,所以我们恢复了数据,很酷:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-10
相关资源
最近更新 更多