SQL Server 2016能否忽略架构名查询?原2014无需指定非DBO架构
解决SQL Server 2016中无需指定非dbo架构即可查询对象的问题
遇到这种升级后行为突变的情况确实头疼,尤其是上百个SSRS存储过程要改的场景,下面几个方案能帮你不用修改现有代码就搞定问题:
1. 修改数据库用户的默认架构
SQL Server解析未指定架构的对象名时,会优先查找当前登录用户对应的数据库用户的默认架构,找不到才会去dbo架构检索。大概率是升级后用户的默认架构配置发生了变化,只需要改回原来的非dbo架构即可:
-- 替换成你的数据库用户名和目标非dbo架构名 ALTER USER [你的数据库用户名] WITH DEFAULT_SCHEMA = [非dbo架构名];
注意:要确认该用户拥有访问目标架构下对象的权限。如果SSRS报表使用的是特定服务账户,一定要修改这个账户对应的数据库用户的默认架构——毕竟报表是用这个账户执行查询的。
2. 批量创建同义词(Synonym)
如果修改默认架构不适用(比如同一个用户需要访问多个非dbo架构的对象),可以在dbo架构下为每个非dbo对象创建同义词。这样原来的查询不用加架构名,直接访问dbo.对象名就会自动指向实际的非dbo对象。
你可以用这个脚本批量生成同义词创建语句:
SELECT 'CREATE SYNONYM dbo.' + OBJECT_NAME(o.object_id) + ' FOR [' + s.name + '].[' + OBJECT_NAME(o.object_id) + '];' FROM sys.objects o JOIN sys.schemas s ON o.schema_id = s.schema_id WHERE s.name <> 'dbo' -- 排除dbo架构的对象 AND o.type IN ('P', 'U', 'V') -- 按需筛选对象类型:存储过程(P)、表(U)、视图(V)
执行脚本后会得到所有目标对象的同义词创建SQL,把这些语句跑一遍,原来的查询就能正常执行了。
3. 临时降级数据库兼容性级别(不推荐长期使用)
如果只是临时过渡,可以把数据库兼容性级别降到120(对应SQL Server 2014的级别),这会让对象解析行为回到之前的状态。但长期来看会影响SQL Server 2016的新功能使用,所以仅作为应急方案:
ALTER DATABASE [你的数据库名] SET COMPATIBILITY_LEVEL = 120;
更推荐前两个方案,尤其是同义词方案,稳定性更高且不影响新特性的使用。
内容的提问来源于stack exchange,提问作者user3137348
相关产品推荐
相关产品推荐

