Dr.*_*len 8 sql-server truncate sql-server-2008
虽然在先生的书中通过sql server面试问题.shiv prashad koirala.我知道,即使在使用truncate table命令后,数据也可以恢复.
请告诉我如何使用'delete'命令删除数据时如何恢复数据?如果使用'truncate'命令删除数据,如何恢复数据.
我所知道的是,当我们使用delete命令删除记录时,它的条目是在日志文件中生成但我不知道如何从中恢复数据,因为我读到截断表没有输入数据库中的任何日志条目然后如何那也可以恢复.
如果你能给我任何好的联系,几乎一步一步地做到这一点对我来说将是非常有帮助的.
我有sql server 2008.
谢谢
如果在代码中使用TRANSACTIONS,则可以回滚TRUNCATE.如果没有使用事务并且提交了TRUNCATE操作,则无法从日志文件中检索它.TRUNCATE是DDL操作,它不会记录在日志文件中.
如果当前会话未关闭,则在TRANSACTION包围时可以回滚DELETE和TRUNCATE.如果在TRANSACTION包围的查询编辑器中写入TRUNCATE,并且会话已关闭,则无法回滚但可以回滚DELETE.
USE tempdb
GO
-- Create Test Table
CREATE TABLE TruncateTest (ID INT)
INSERT INTO TruncateTest (ID)
SELECT 1
UNION ALL
SELECT 2
UNION ALL
SELECT 3
GO
-- Check the data before truncate
SELECT * FROM TruncateTest
GO
-- Begin Transaction
BEGIN TRAN
-- Truncate Table
TRUNCATE TABLE TruncateTest
GO
-- Check the data after truncate
SELECT * FROM TruncateTest
GO
-- Rollback Transaction
ROLLBACK TRAN
GO
-- Check the data after Rollback
SELECT * FROM TruncateTest
GO
-- Clean up
DROP TABLE TruncateTest
GO
Run Code Online (Sandbox Code Playgroud)
小智 5
默认情况下,这两个中没有一个可以恢复,但在可能的情况下有特殊情况.
截断:执行截断时,SQL Server不会删除数据,只会释放页面.这意味着如果您仍然可以阅读这些页面(使用查询或第三方工具),则可以恢复数据.但是,在覆盖这些页面之前,您需要快速行动.
删除:如果数据库处于完全恢复模式,则所有事务都记录在事务日志中.如果您可以读取事务日志,理论上可以找出所有受影响的行的先前值,然后恢复数据.
恢复方法:
一种方法是使用类似于此处发布的SQL查询进行截断或使用fn_dblog等函数来读取事务日志.
另一个是使用第三方工具,如ApexSQL Log,SQL Log Rescue, ApexSQL Recover或Quest Toad