【发布时间】:2011-01-11 19:35:54
【问题描述】:
有什么方法可以撤消 SQL 更新查询?
【问题讨论】:
-
你没有说你使用的是什么数据库。如果您使用的是 oracle,您可以尝试使用闪回查询来恢复您的混乱数据。
标签: sql sql-update undo
有什么方法可以撤消 SQL 更新查询?
【问题讨论】:
标签: sql sql-update undo
根据您的 DBMS 事务处理方式不同,因此请阅读文档。例如mysql 是这样的:
START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
BEGIN;
UPDATE accounts SET balance = balance - 100.00
WHERE name = 'Alice';
-- etc etc
COMMIT;
与TSQL:
DECLARE @TranName VARCHAR(20)
SELECT @TranName = 'MyTransaction'
BEGIN TRANSACTION @TranName
GO
USE pubs
GO
UPDATE roysched
SET royalty = royalty * 1.10
WHERE title_id LIKE 'Pc%'
GO
COMMIT TRANSACTION MyTransaction
GO
也有一些动作不能放入事务中,但在大多数数据库管理系统中你可以发现这些天你应该能够回滚update。
最后,如果您准确记录数据库中发生的所有事情,您可以随时撤消更新,但那是另一回事了。
【讨论】:
SQL Server 不支持开箱即用,但在某些情况下,可以通过读取事务日志来恢复数据。如果数据库处于完全恢复模式并且需要像 ApexSQL Log 或 Log Rescue 这样的第 3 方工具,则此方法有效。还有一种使用 DBCC LOG 命令读取 t-log 的方法,但结果可能太难了。
您还可以查看以下讨论的主题:
【讨论】:
如果您在事务中运行更新,则可以回滚事务。
SQL 服务器:
begin transaction
update [Table] set col1 = 'test' where Id = 3
rollback transaction
另一种技术可能是将更新触发器添加到表中,并且每当更新记录时,将先前的值保存到“历史”表中。如果此表被大量使用,这可能是一个好主意,也可能不是一个好主意。
【讨论】:
撤消在 SQL 中称为 rollback。完成commit 后,如果不恢复备份,就无法撤消它。
请注意,执行回滚将撤消整个事务,这意味着自事务开始以来的每次更新、插入和删除,通常是自上次提交或回滚以来。这意味着如果您执行两次连续更新,则不能仅撤消第二次更新。一些数据库提供了允许这样做的“保存点”。
【讨论】:
仅当您处于事务中(如 marcgg 所说)或您有最近的备份时……以这种方式恢复确实会更多地使用“撤消”一词……
【讨论】:
您可以使用第三方工具,例如 Red Gate 的Log Rescue。他们的 SQL Toolkit 有 14 天的免费功能试用版。 (假设 SQL Server 2000!)。
【讨论】: