【问题标题】:unreliable information_schema schema information on SQL Server?SQL Server 上的 information_schema 架构信息不可靠?
【发布时间】:2011-08-27 22:50:32
【问题描述】:

SQL Server 文档hereinformation_schema.tablestable_schema 字段“不可靠”,获取对象架构的正确方法是查询sys.objects

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

【问题讨论】:

  • 查看EXEC sp_helptext 'INFORMATION_SCHEMA.TABLES' 的输出,这确实使用sys.objects,所以看起来很奇怪。
  • 从技术上讲,在 SQL Server 2000 中,此列报告了对象的所有者,而不是其架构,尽管在 2000 年这个概念无论如何是可以互换的。除非跨 RDBMS 可移植性是重中之重,否则我强烈建议对元数据使用 sys 目录视图而不是 INFORMATION_SCHEMA,主要是因为前者将针对新功能进行扩展,但后者相对停滞不前。 (例如,尝试使用INFORMATION_SCHEMA 查找过滤索引。)
  • @Martin 您是否注意到它执行LEFT JOIN?在我看来,这表明在某些情况下架构可能无效(无法想象这一点)。但是警告信息(语法不正确等等)意义不大,因为这意味着sys.objects指向的sys.schemas中的行也是无效的,那么如何使用sys.objects(或者更合适的sys.tables ) 给你比INFORMATION_SCHEMA更可靠的东西吗?
  • @Aaron - 如果数据库已从 SQL Server 2000 升级,并且已使用任何新的 DDL 语句,sys.sysobjects 中的架构信息可能是错误的as described here。也许他们只是对一些太多的事情发出警告?
  • @all,感谢 cmets。

标签: sql-server information-schema


【解决方案1】:

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

  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)您没有使用任何特定于平台的功能那将被错过。除了多平台供应商工具之外,这可能是一种非常罕见的情况(即使在这种情况下,也可能会导致使用这些功能但工具没有使用它们的客户不高兴)。 p>

  3. 我提交了单独的 Connect 建议 (Connect #686121),他们会在 Books Online 中的所有 INFORMATION_SCHEMA 视图主题上贴上关于此不完整的警告。我认为他们不是众所周知的不是从 SQL Server 中获取元数据的首选方式,谁能责怪人们没有看到这一点 - 毕竟,我们总是被告知使用符合标准的方法是“最佳实践”,而使用专有方法则相反。与许多数据库事物一样,“这取决于”-但我怀疑,通常情况下,您最好使用 sys 目录视图,除非您处于仅使用功能的罕见场景中在标准通用的 SQL Server 中。我认为我没有遇到过任何情况下出现这种情况的情况,但如果它们确实存在的话,我很乐意了解它们。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 2018-05-06
    • 1970-01-01
    相关资源
    最近更新 更多