我有几个表要加密。对于每列,我创建另一列来保存加密值。列类型是varbinary(256)。这没有任何问题。
在调试过程中,我解密了表并删除了这些列。我重复创建列并加密值的存储过程。创建并删除这些列几次后,我得到的最大大小超过了警告。创建列并且数据加密没有问题。如果我删除表并重新创建它,则可以进行另外几次迭代。 我已经尝试了几个具有不同定义且具有相同结果的表格。
如果添加和删除列,表中会留下一些内容。收缩数据库和DBCC CLEANTABLE没有帮助。
发生了什么以及如何解决这个问题?
由于
答案 0 :(得分:1)
当你在sql server中删除一个列时,它实际上并没有删除 - 这些位(页面)只是被标记为已死并且不会被重用。
这个小例子会告诉你
set nocount on
create table dbo.mytable (bigcolumn nvarchar(3500))
insert into dbo.mytable (bigcolumn) values (replicate('x',3500))
go 50
exec sp_spaceused mytable
--name rows reserved data index_size unused
--mytable 50 464 KB 400 KB 16 KB 48 KB
alter table dbo.mytable add bigcolumntoo nvarchar(3500)
exec sp_spaceused mytable
-- you will see the table size is still the same (as we havent populated the new column)
--name rows reserved data index_size unused
--mytable 50 464 KB 400 KB 16 KB 48 KB
-- lets drop the original column
alter table dbo.mytable drop column bigcolumn
--check the size of the table and you will see it is still the same
exec sp_spaceused mytable
--name rows reserved data index_size unused
--mytable 50 464 KB 400 KB 16 KB 48 KB
如果您使用专用管理连接登录,那么您将能够在基表中跟踪并查找对象(您的列)。值得注意的是,默认约束等情况也是如此。
如果您想避免这种情况,那么您只需重新设计解决方案。
希望这有帮助