如何在没有事务的情况下回滚

时间:2012-09-20 15:52:28

标签: sql sql-server-2008 rollback

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

update Contact set ContaPassword = '7FD736A3070CB9766'

我忘记了WHERE子句,因此这样更新了所有用户的密码。 :(

我可以在此查询之前恢复数据吗?

1 个答案:

答案 0 :(得分:6)

如果您在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所指出的,如果你有备份,就不难回到原始数据。您可以在某处恢复备份并复制原始数据。