代码之家  ›  专栏  ›  技术社区  ›  Alex Bagnolini

SQL的DELETE语句是否确实删除数据?

  •  4
  • Alex Bagnolini  · 技术社区  · 15 年前

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

    除了定时备份之外,我们每天压缩一次日志文件,并使用 DELETE 命令删除表中需要的记录。

    不过,为了这个目的,我用一个编辑器(使用pspad)打开了.mdf文件,并在其中一个表中搜索了一个独特的数据块(我确信)。

    问题 :我在文件中跟踪了它,然后执行了 删除 命令,它还在那里。

    问题 : 是否有一个我们不知道的特定命令来物理删除磁盘上的记录?

    注意:我们知道有一些特殊的技术可以从硬盘中恢复丢失的数据,但这里我讲的是一个想要使用记事本的人!

    4 回复  |  直到 15 年前
        1
  •  6
  •   gbn    15 年前

    文本可能仍然存在,但SQL Server不知道该数据具有任何结构或可用性。

    “释放的空间”只是简单地解除分配:不删除、压缩或归零。

    Instant File Initialization “该功能也依赖于此功能(而不是将整个MDF文件归零),以前的磁盘数据对于全新的数据库仍然可用:

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

    编辑:回收空间:

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

    DBCC SHRINKFILE using NOTRUNCATE 可以将页面压缩为释放的页面导致的间隙,但不会回收空间 在里面 删除行的页面

        2
  •  4
  •   cdonner    15 年前

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

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

        3
  •  4
  •   Remus Rusanu    15 年前

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

        4
  •  0
  •   meriton    15 年前

    你可以 update 在发布 delete 从而在数据库将数据标记为可用之前覆盖磁盘上的数据。(不过,这是否也适用于业务线领域需要进行调查)。

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