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

时间:2011-08-27 22:50:33

标签: sql-server information-schema

SQL Server文档here表示table_schema的{​​{1}}字段“不可靠”,获取对象架构的正确方法是查询{{1} }。

information_schema.tables报告的架构可能不正确

1 个答案:

答案 0 :(得分:13)

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

  1. 文档中的措辞不准确,正在纠正中(见Connect #686118)。我不确定他们是否会同时更正2005,2008和2008 R2文档,或者旧版本是否会更新。关键是我无法想象任何一个视图中的模式不正确的情况,但更重要的是,当sys.objects正确时,info_schema不正确。后者是不可能的 - 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的平台上工作的元数据例程 AND (b)您没有使用任何特定于平台的功能那将是错过的。除了多平台供应商工具之外,这可能是一种非常罕见的情况(即使在这种情况下,也可能会导致使用这些功能而 使用这些功能的客户不满意。)

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