为啥会有关于 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_schema
和table_schema
都使用schema_name()
。而且,正如this 问题和其他地方所述,已知该函数有时会给出不同的结果,具体取决于您的查询是跨数据库的还是您的用户的默认架构是否与其他人的不同。
我实际上从未见过 information_schema 查询在架构字段中给出意外结果,也许 sys.views 和 sys.tables 的输出实际上不可能(空 schema_id 会产生问题),但是这个一般schema_name()
的行为可能足以让他们做出免责声明。
【讨论】:
以上是关于为啥会有关于 VIEW_COLUMN_USAGE.VIEW_SCHEMA 的警告?的主要内容,如果未能解决你的问题,请参考以下文章