9

此处的 SQL Server 文档说 的table_schema字段information_schema.tables是“不可靠的”,并且获取对象架构的正确方法是查询sys.objects.

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

4

1 回答 1

16

很遗憾,这没有得到答复,只是部分出于代表贪婪而发表评论,更重要的是为了将其排除在未答复的队列中,我将在答案中加几分。

  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 中,带有 config 选项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 #686121INFORMATION_SCHEMA ),他们会在联机丛书中的所有视图主题上贴上关于这种不完整的警告。我不认为众所周知,它们不是从 SQL Server 中获取元数据的首选方式,谁能责怪人们没有看到这一点——毕竟,我们总是被告知使用符合标准的方法是一种“最佳实践”和使用专有方法是相反的。与许多数据库事物一样,“这取决于”-但我怀疑,通常情况下,您最好使用sys目录视图,除非您处于仅使用标准通用的 SQL Server 功能的罕见场景中。我认为我在任何情况下都没有遇到过这种情况,但如果它们确实存在,我很乐意了解它们。

我还写过关于INFORMATION_SCHEMA这里不可靠的博客:

于 2011-09-05T16:40:18.253 回答