为啥会有关于 VIEW_COLUMN_USAGE.VIEW_SCHEMA 的警告?

Posted

技术标签:

【中文标题】为啥会有关于 VIEW_COLUMN_USAGE.VIEW_SCHEMA 的警告?【英文标题】:Why the warning about VIEW_COLUMN_USAGE.VIEW_SCHEMA?为什么会有关于 VIEW_COLUMN_USAGE.VIEW_SCHEMA 的警告? 【发布时间】:2021-09-08 09:45:04 【问题描述】:

我最近注意到,Microsoft 文档网站上的 INFORMATION_SCHEMA.VIEW_COLUMN_USAGE 视图文档包含 VIEW_SCHEMA 和 TABLE_SCHEMA 列的警告:

** 重要 ** 查找对象架构的唯一可靠方法是查询 sys.objects 目录视图。[原文如此]

该警告必须有具体原因,而且仅限于这两个领域。警告的原因是什么?是否知道这个information_schema 视图在什么情况下会弄错schema 字段?

我需要知道我应该有多担心;以及我需要多努力才能替换使用该视图的现有代码。

【问题讨论】:

【参考方案1】:

这可能只是部分答案,但也许对您来说已经足够了,或者它可以引导其他人获得更完整的答案。但我可以告诉你:

exec sp_helptext 'information_schema.view_column_usage'

返回:

SELECT  
 DB_NAME()     AS VIEW_CATALOG,  
 SCHEMA_NAME(v.schema_id) AS VIEW_SCHEMA,  
 v.name      AS VIEW_NAME,  
 DB_NAME()     AS TABLE_CATALOG,  
 SCHEMA_NAME(t.schema_id) AS TABLE_SCHEMA,  
 t.name      AS TABLE_NAME,  
 c.name      AS COLUMN_NAME  
FROM  
 sys.views v JOIN sys.sql_dependencies d ON d.object_id = v.object_id  
 JOIN sys.objects t ON t.object_id = d.referenced_major_id  
 JOIN sys.columns c ON c.object_id = d.referenced_major_id  
  AND c.column_id = d.referenced_minor_id  
WHERE  
 d.class < 2  

如您所见,view_schematable_schema 都使用schema_name()。而且,正如this 问题和其他地方所述,已知该函数有时会给出不同的结果,具体取决于您的查询是跨数据库的还是您的用户的默认架构是否与其他人的不同。

我实际上从未见过 information_schema 查询在架构字段中给出意外结果,也许 sys.views 和 sys.tables 的输出实际上不可能(空 schema_id 会产生问题),但是这个一般schema_name() 的行为可能足以让他们做出免责声明。

【讨论】:

以上是关于为啥会有关于 VIEW_COLUMN_USAGE.VIEW_SCHEMA 的警告?的主要内容,如果未能解决你的问题,请参考以下文章

为啥会有一个子类 NSManagedObject?

RxSwift 为啥我们没有调用 dispose 会有内存泄漏

字节顺序测试:为啥以下代码有效?

为啥在增加数组名称时没有“需要左值”错误[重复]

为啥有人说Python的多线程是鸡肋?

为啥有人说 Python 的多线程是鸡肋