Fra*_*nia 6 sql-server database-internals update
是否可以在 T-SQL 更新语句中覆盖相同的磁盘地址?出于安全或匿名原因,用例将阻止恢复磁盘上的原始文本。
CREATE TABLE Test(
Id int,
Message nvarchar(1000))
GO
INSERT INTO Test (Id, Message) VALUES (1, 'Hello!')
GO
Run Code Online (Sandbox Code Playgroud)
所以在这一点上,“你好!” 写入磁盘。如果运行更新语句,是否可以保证(或至少很有可能)覆盖磁盘上的相同位置?
UPDATE Test SET Message = '000000' WHERE Id = 1
GO
Run Code Online (Sandbox Code Playgroud)
在 SQL Server 实现中,原始 'Hello!' 的概率是多少?价值将不再在磁盘上?
我假设新值的大小相同。我的猜测是,如果新值的大小不同,那么 SQL Server 会将更新后的值写入新位置,留下“你好!” 在原来的位置,但现在标记为免费。我还假设删除对磁盘上的原始值没有任何影响,而只是将该位置标记为空闲。
如果情况并非如此,或者不能保证,或者至少很有可能,是否有另一种方法可以从磁盘中删除该值?
这里的要求不是达到保护政府机密安全的程度。这更像是一种营销声明,即已删除的项目确实已经消失并且无法恢复。
我知道这里有很多警告。我知道 SQL 语言没有解决这个问题。我特别询问 SQL Server 的实现。答案可能是它是不可知的。只是想知道是否有文档或常识,或者是否有人测试了实现细节。
我们正在使用不加密 SQL Server 磁盘的托管服务。我们在写入数据库之前对值进行加密。只是在研究“腰带和牙套”解决方案。
这有很多方面,但简短的回答是您必须期望旧值可以在磁盘上(因为这是我理解的问题归结为)。
因此,这与以下问题属于同一类别,答案相同:
问:我们能否防止 Windows 管理员在 SQL Server 中执行任何操作并查看 SQL Server 中的所有数据?
答:不可以。但是您可以尝试确保他们阅读的内容对他们来说是垃圾。即,合适的加密实现。
如果您真的对此感兴趣,我建议您先阅读 SQL Server 的存储体系结构。没有它,你将无法得到答案的反面。即,确保您了解数据库文件、页面、事务日志、堆、B 树等。
更新可以在同一页面上就地完成。这也适用于索引。如果您修改索引列的键,则该行必须移动(内部删除/插入)。如果该行不适合,那么您将获得转发记录或页面拆分。另一个因素是在删除之后(并且更新可以是删除/插入,请记住),旧行最初仍将作为幽灵行存在。但即使在那之后,页面也不会“在删除时压缩”,即在稍后需要“空闲”空间时完成存储回收。
然后你有事务日志。
和备份。
如果您启用了版本控制,那么旧的行版本将在 tempdb 中并在不需要时在一段时间后清除。
以及其他可能不太基本的技术如何影响图片的复杂性。我在考虑诸如:
我想你现在已经明白了。不,您不能声称旧数据已经消失。加密可能是其中的一个重要组成部分,具体取决于您的特定情况。