SQL的DELETE语句是否真的删除了数据?

时间:2009-12-21 14:51:29

标签: sql sql-server security

故事:今天我们的一位客户问我们他在程序中删除的所有数据是否都无法恢复。

除了计划备份之外,我们每天缩小一次日志文件,并且我们使用DELETE命令删除表中所需的记录。

虽然,仅仅是为了它,我用编辑器(使用PSPad)打开了.mdf文件,并搜索了一个特定的独特数据 - 我确信 - 在一个表中。

问题:我在文件中跟踪了它,然后执行了DELETE命令,它仍然存在。

问题: 是否有一个特殊的命令,我们不知道从磁盘中物理删除记录?

注意:我们知道有一些特殊的技术可以从硬盘驱动器中恢复丢失的数据,但在这里我说的是一个记事本 - 想要的!

4 个答案:

答案 0 :(得分:6)

文本可能仍然存在,但SQL Server没有任何结构或可用数据的概念。

“释放的空间”只是被解除分配:不删除,压缩或归零。

Instant File Initialization”功能也依赖于此(不会将整个MDF文件归零),并且以前的磁盘数据仍可用于全新数据库的eben:

  

由于删除的磁盘内容仅在新数据写入文件时被覆盖,因此未经授权的主体可能会访问已删除的内容。

编辑:回收空间:

ALTER INDEX...WITH REBUILD是最好的方法

DBCC SHRINKFILE using NOTRUNCATE可以将页面压缩到由解除分配的页面导致的间隙中,但不会在页面中为已删除的行回收空间

答案 1 :(得分:4)

SQL Server只是将已删除行的空间标记为可用,但不会重新组织数据库,也不会将释放的空间清零。尝试“收缩”数据库,不再找到已删除的行。

谢谢,gbn,你的纠正。页面是数据库的分配单元,缩小数据库只会消除页面,但不会压缩它们。您必须删除页面中的所有行才能看到它们在收缩后消失。

答案 2 :(得分:4)

如果您的客户关注数据安全性,则应使用Transparent Database Encryption。即使您从表中删除了信息,该记录仍然在日志中。即使回收日志,信息仍然在备份中。

答案 3 :(得分:0)

在发出update之前,您可以delete具有虚拟值的记录,从而在数据库将其标记为空闲之前覆盖磁盘上的数据。 (这是否适用于LOB字段也可以进行调查)。

当然,你仍然有日志和备份的问题,但我认为你已经解决了这些问题。