SQL更新撤消

时间:2010-02-01 16:56:52

标签: sql sql-update undo

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

6 个答案:

答案 0 :(得分:17)

除非您在trans action内进行投放,否则无法使用。

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

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

答案 1 :(得分:6)

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

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

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

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

答案 2 :(得分:5)

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

SQL Server:

begin transaction

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

rollback transaction

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

答案 3 :(得分:2)

在SQL中调用撤消rollback。完成commit后,如果不进行恢复备份,则无法撤消。

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

答案 4 :(得分:1)

只有当你在一个交易中(如marcgg)所说或者你有一个最近的备份......恢复那样的方式确实会使“撤销”这个术语更加坚固......

答案 5 :(得分:0)

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