有没有办法我们可以撤消 SQL 更新查询?
6 回答
根据您的 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
.
最后,如果您保留数据库中发生的所有事情的精确日志,则始终可以撤消更新,但这是另一回事。
SQL Server 不支持开箱即用,但在某些情况下,可以通过读取事务日志来恢复数据。如果数据库处于完全恢复模式并且需要ApexSQL Log或Log Rescue等 3rd 方工具,则此方法有效。还有一种使用 DBCC LOG 命令读取 t-log 的方法,但结果可能太难了。
您还可以查看以下讨论的主题:
如果在事务中运行更新,则可以回滚事务。
SQL 服务器:
begin transaction
update [Table] set col1 = 'test' where Id = 3
rollback transaction
另一种技术可能是将更新触发器添加到表中,并且每当更新记录时,将先前的值保存到“历史”表中。如果此表被大量使用,这可能是一个好主意,也可能不是一个好主意。
rollback
在 SQL中调用撤消。一旦你完成了commit
,你就不能在不恢复备份的情况下撤消它。
请注意,执行回滚将撤消整个事务,这意味着自事务开始以来的每次更新、插入和删除,通常是自上次提交或回滚以来。这意味着,如果您连续进行两次更新,则不能仅撤消第二次更新。一些数据库提供了允许这样做的“保存点”。
仅当您处于事务中(如 marcgg 所说)或您有最近的备份时……以这种方式恢复确实会大大增加“撤消”一词的含义……
您可以使用第三方工具,例如 Red Gate 的Log Rescue。他们的 SQL Toolkit 有 14 天的免费功能试用版。(假设 SQL Server 2000!)。