【问题标题】:SQL update undoSQL 更新撤消
【发布时间】:2011-01-11 19:35:54
【问题描述】:

有什么方法可以撤消 SQL 更新查询?

【问题讨论】:

  • 你没有说你使用的是什么数据库。如果您使用的是 oracle,您可以尝试使用闪回查询来恢复您的混乱数据。

标签: sql sql-update undo


【解决方案1】:

除非你在 transaction 中运行它,否则你不能。

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

最后,如果您准确记录数据库中发生的所有事情,您可以随时撤消更新,但那是另一回事了。

【讨论】:

    【解决方案2】:

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

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

    How can I rollback an UPDATE query in SQL server 2005?

    Read the log file (*.LDF) in SQL Server 2008

    【讨论】:

      【解决方案3】:

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

      SQL 服务器:

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

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

      【讨论】:

        【解决方案4】:

        撤消在 SQL 中称为 rollback。完成commit 后,如果不恢复备份,就无法撤消它。

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

        【讨论】:

          【解决方案5】:

          仅当您处于事务中(如 marcgg 所说)或您有最近的备份时……以这种方式恢复确实会更多地使用“撤消”一词……

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-06-10
              • 1970-01-01
              • 2023-03-05
              • 2012-02-15
              • 2018-03-16
              • 2015-03-13
              • 1970-01-01
              • 2012-12-28
              相关资源
              最近更新 更多