不可靠的information_schema SQL Server的模式信息



这里的SQL Server文档说information_schema.tablestable_schema字段是"不可靠的",正确获取对象模式的方法是查询sys.objects

谁能详细说明 information_schema.tables报告的模式可能是不正确的?

很遗憾这个问题没有得到回答,只是部分地出于贪婪而进行了注释,更重要的是为了将它从未得到回答的队列中取出来,我将在回答中加入一些要点。

  1. 文件中的措辞不准确,正在更正中(见连接#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中,他们为序列添加了一个info_schema视图,但这同样满足了最低标准,并且不包括任何关于SQL server特定实现细节的信息(例如,它是否耗尽,如果他们在未来添加任何新功能,你可以肯定info_schema视图不会被保留在循环中)。坚持使用info_schema视图的唯一情况是:(a)您正在编写需要跨info_schema兼容的平台工作的元数据例程;(b)您没有使用任何可能会错过的特定于平台的特性。除了多平台供应商的工具之外,这可能是一个非常罕见的场景(即使在这种情况下,也可能导致不满意的客户使用这些功能,而工具没有选择它们)。

  3. 我提交了一个单独的连接建议(连接#686121),他们在图书在线的所有INFORMATION_SCHEMA视图主题上粘贴关于此不完整性的警告。我不认为它们不是从SQL Server中获取元数据的首选方式,谁能责怪人们没有看到这一点呢——毕竟,我们总是被告知使用符合标准的方法是"最佳实践",而使用专有方法则相反。对于许多数据库的事情,"这取决于"——但我怀疑,通常情况下,您最好使用sys目录视图,除非您在极少数情况下,您只使用SQL Server中常见的标准功能。我不认为我遇到过这样的情况,但如果他们确实存在,我很高兴了解他们。

我也在这里写过关于INFORMATION_SCHEMA的不可靠性的博客:

  • 针对INFORMATION_SCHEMA视图的案例

最新更新