使用SQLSERVER2000创建表时如果表中有text或image栏位会自动创建一个系统索引,其indid=255,索引的名称为固定字符’t’加表名。直接使用drop index无法删除该索引,其提示信息为“无法 除去 索引 '<表名>.<索引名称>',因为它是系统 索引。”,是不是真的不能删除呢?答案是否定的。
其实通过创建索引时带DROP_EXISTING选项可以轻松绕过SQLSERVER2000的安全验证从而实现删除系统索引功能,原理是先创建一个同名的非系统索引,然后删除。这也反映出SQLSERVER2000在安全性上存在一定的不足。
我们假设表名为t_test,包含c1和c2栏位,栏位c2为text类型,其自动创建的系统索引为tt_test。
CREATE INDEX tt_test ON t_test(c1) WITH DROP_EXISTING
DROP INDEX t_test.tt_test
以上代码在SQLSERVER2000上通过。
不过最后强烈建议你不要删除该索引,因为该索引指明了表中text、image数据将存放在哪个文件组,如果删除,新插入的数据将被放置在缺省文件组,还可能导致查询不到已有的数据,这应该不是你想要的结果吧?
作者:康剑民 kangjianmin@163.com
写作日期:2006-06-30