SQL Server上不可靠的information_schema架构信息?

Rya*_*per 7 sql-server information-schema

SQL Server文档在这里说,该table_schema领域information_schema.tables是"不可靠",并且得到一个对象的架构的正确方法是查询sys.objects.

任何人都可以详细说明报告的架构如何以及何时information_schema.tables可能不正确?

Aar*_*and 13

令人遗憾的是,这个问题没有得到解决,只是部分地表达了贪婪的说法,更重要的是要将它从未回答的队列中删除,我会在答案中提出几点意见.

  1. 文档中的措辞不准确,正在纠正过程中(参见Connect#686118).我不确定他们是否会同时更正2005,2008和2008 R2文档,或者旧版本是否会更新.关键是我无法想象任何一个视图中的模式不正确的情况,但更重要的是,info_schema在正确的情况下是不sys.objects正确的.后者是不可能的 - info_schema视图完全基于sys.objects视图(只是看SELECT OBJECT_DEFINITION (OBJECT_ID ('INFORMATION_SCHEMA.TABLES'));),所以如果一个不正确,它们都是不正确的.可能存在一些模糊的情况,它们都可能不正确,但在当前版本中不存在(例如,在SQL Server 2000中,allow updates启用了配置选项,从sysusers中删除拥有对象的用户 - 今天并不真正相关或可能,以及不是我愿意尝试的东西,但它是我能想象的唯一可以在任何时间推动当前措辞的东西).

  2. 通常,INFORMATION_SCHEMA应避免使用视图,以支持SQL Server 2005中引入的目录视图(并从那时起进行了扩充).为什么?因为在将新功能添加到SQL Server时继续开发目录视图,而info_schema视图则没有.正如我在评论中提到的,尝试在info_schema中查找有关已过滤索引的信息.包含的列,XML索引,标识/计算列,针对唯一索引的外键也是如此 - 这些都在info_schema视图中完全缺失或表示不同.在Denali中,他们为Sequences添加了一个info_schema视图,但这又符合标准的最低要求,并且不包含有关SQL Server特定实现细节的任何信息(例如,它是否已用尽,以及它们是否添加了任何新功能未来你可以确定info_schema视图不会保留在循环中).在那里你会坚持info_schema意见的唯一情况是如果(a)你正在编写需要跨兼容info_schema的平台工作的元数据程序(b)您不使用任何特定于平台的功能,将被错过.除了多平台供应商工具这可能是一个非常罕见的情况下(甚至在这种情况下可能导致谁不高兴的客户正在使用这些功能和工具并没有接他们回家).

  3. 我提交了一份单独的Connect建议(Connect#686121),他们INFORMATION_SCHEMA在联机丛书中的所有视图主题上对此不完整性进行了警告.我不认为它们不是从SQL Server中获取元数据的首选方式,并且可以责怪人们没有看到这一点 - 毕竟,我们总是被告知使用符合标准的方法是"最佳实践"和使用专有方法是相反的.与许多数据库事物一样,"它取决于" - 但我怀疑,通常情况下,你最好不要使用sys目录视图,除非你处于极少数情况下你只使用SQL Server中的功能这是标准所共有的.在这种情况下,我认为我没有遇到任何容量的单一实例,但如果它们确实存在,我会非常乐意了解它们.

我还在博客上写到了INFORMATION_SCHEMA这里的不可靠性: