我们有办法撤消 SQL 更新查询吗?
你不能,除非你在交易中运行它。
根据您的 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 服务器:
begin transaction
update [Table] set col1 = 'test' where Id = 3
rollback transaction
另一种技术可能是向表添加更新触发器,并且每当更新记录时,将以前的值保存到“历史”表中。如果这张表被大量使用,这可能是个好主意,也可能不是个好主意。
SQL Server 并不直接支持此功能,但在某些情况下可以通过读取事务日志来恢复数据。如果数据库处于完全恢复模式并且需要 ApexSQL Log 或 Log Rescue 等第三方工具,则此方法有效。还有一种使用 DBCC LOG 命令读取 t-log 的方法,但它可能会变得太困难。
您还可以查看以下讨论此问题的主题:
撤消在 SQL 中称为
rollback
。一旦完成 commit
,您就无法撤消它,除非恢复备份。
请注意,执行回滚将撤消整个事务,这意味着自事务开始(通常是自上次提交或回滚以来)以来的每次更新、插入和删除。这意味着如果您连续进行两次更新,则无法仅撤消第二次更新。有些数据库提供“保存点”,确实允许这样做。
仅当您处于事务中(如 marcgg 所说)或者您最近有备份时...以这种方式恢复确实会过多地使用术语“撤消”..
您可以使用第三方工具,例如 Red Gate 的 Log Rescue。他们的 SQL Toolkit 有 14 天的免费功能试用版。 (假设 SQL Server 2000!)。
在生产数据库上的更新语句出错后来到这篇文章,并且最近没有正确的备份。
如果您使用的是 Microsoft SQL Server 并且您的数据库使用“完整”恢复模型(在 SSMS 中,右键单击“数据库”、“数据库属性”、“选项”)
借助事务日志,您可能会得救,可以将数据库恢复到更新之前的时间。
我不确定他们是如何做到这一点的,但单击“恢复到时间线按钮”->“特定日期和时间”并选择更新之前的时间。 这需要一点时间,但救了我。
之后,请确保您的备份策略正确:)