SQL Server中多架构下无指定架构访问同名表的行为咨询
关于SQL Server无架构限定表名的解析规则
嘿,这个问题问到点子上了——涉及到报表稳定性,不敢随便测试太正常了!我来给你理清楚SQL Server在这里的行为:
- 不会直接执行失败,除非当前用户有权限访问的所有架构里都找不到叫
Dude的表,才会抛出「无效的对象名称」错误。 - 不是按字母顺序优先选
arch.Dude,核心逻辑是看当前会话用户的默认架构:- SQL Server会先在当前用户的默认架构里查找
Dude表。比如如果你的默认架构是dbo,那SELECT * FROM Dude会直接指向dbo.Dude;如果默认架构被改成了arch,才会优先找arch.Dude。 - 如果默认架构里没有这个表,SQL Server才会去遍历当前用户拥有
SELECT权限的所有架构,按架构名称的字母顺序查找第一个存在Dude表的架构——这时候才有可能选中arch.Dude,但前提是默认架构里没有,且arch在有权限的架构排序里比其他有同名表的架构更靠前。
- SQL Server会先在当前用户的默认架构里查找
关键建议
为了彻底避免这种歧义(毕竟默认架构可能被修改,权限也可能变化),生产环境里的SQL语句一定要明确指定架构,比如写成SELECT * FROM dbo.Dude或者SELECT * FROM arch.Dude,这样完全不会有意外,报表的稳定性也有保障。
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

