SQL 更新撤消

问题描述 投票:0回答:7

我们有办法撤消 SQL 更新查询吗?

sql sql-update undo
7个回答
25
投票

你不能,除非你在交易中运行它。

根据您的 DBMS 事务的处理方式会有所不同,因此请阅读文档。例如,对于 mysql,它是这样的:

START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;

Postresql

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

最后,如果您保留数据库中发生的所有事情的精确日志,您随时可以撤消更新,但这是另一个故事了。


7
投票

如果您在事务内运行更新,则可以回滚事务。

SQL 服务器:

begin transaction

update [Table] set col1 = 'test' where Id = 3

rollback transaction

另一种技术可能是向表添加更新触发器,并且每当更新记录时,将以前的值保存到“历史”表中。如果这张表被大量使用,这可能是个好主意,也可能不是个好主意。


6
投票

SQL Server 并不直接支持此功能,但在某些情况下可以通过读取事务日志来恢复数据。如果数据库处于完全恢复模式并且需要 ApexSQL LogLog Rescue 等第三方工具,则此方法有效。还有一种使用 DBCC LOG 命令读取 t-log 的方法,但它可能会变得太困难。

您还可以查看以下讨论此问题的主题:

如何在 SQL Server 2005 中回滚 UPDATE 查询?

读取 SQL Server 2008 中的日志文件 (*.LDF)


2
投票

撤消在 SQL 中称为

rollback
。一旦完成
commit
,您就无法撤消它,除非恢复备份。

请注意,执行回滚将撤消整个事务,这意味着自事务开始(通常是自上次提交或回滚以来)以来的每次更新、插入和删除。这意味着如果您连续进行两次更新,则无法仅撤消第二次更新。有些数据库提供“保存点”,确实允许这样做。


1
投票

仅当您处于事务中(如 marcgg 所说)或者您最近有备份时...以这种方式恢复确实会过多地使用术语“撤消”..


0
投票

您可以使用第三方工具,例如 Red Gate 的 Log Rescue。他们的 SQL Toolkit 有 14 天的免费功能试用版。 (假设 SQL Server 2000!)。


0
投票

在生产数据库上的更新语句出错后来到这篇文章,并且最近没有正确的备份。

如果您使用的是 Microsoft SQL Server 并且您的数据库使用“完整”恢复模型(在 SSMS 中,右键单击“数据库”、“数据库属性”、“选项”)

借助事务日志,您可能会得救,可以将数据库恢复到更新之前的时间。

我不确定他们是如何做到这一点的,但单击“恢复到时间线按钮”->“特定日期和时间”并选择更新之前的时间。 这需要一点时间,但救了我。

之后,请确保您的备份策略正确:)

© www.soinside.com 2019 - 2024. All rights reserved.