21

有没有办法我们可以撤消 SQL 更新查询?

4

6 回答 6

20

你不能,除非你在一个事务中运行

根据您的 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.

最后,如果您保留数据库中发生的所有事情的精确日志,则始终可以撤消更新,但这是另一回事。

于 2010-02-01T16:58:41.287 回答
6

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

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

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

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

于 2013-03-11T10:22:01.830 回答
5

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

SQL 服务器:

begin transaction

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

rollback transaction

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

于 2010-02-01T16:59:28.433 回答
2

rollback在 SQL中调用撤消。一旦你完成了commit,你就不能在不恢复备份的情况下撤消它。

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

于 2010-02-01T17:00:20.083 回答
1

仅当您处于事务中(如 marcgg 所说)或您有最近的备份时……以这种方式恢复确实会大大增加“撤消”一词的含义……

于 2010-02-01T17:00:30.117 回答
0

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

于 2010-02-01T17:00:36.153 回答