有没有办法可以撤消SQL更新查询?
答案 0 :(得分:17)
根据您的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 Log或Log Rescue),则此方法有效。还有一种使用DBCC LOG命令读取t-log的方法,但它可能会变得太难。
您还可以查看以下讨论内容的主题:
答案 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!)。