SSRS调用存储过程报错:无法找到用户'dbo'的排查求助
这问题有点 tricky,我结合经验给你列几个可能的排查点:
检查存储过程中的
GRANT语句
你的存储过程末尾包含了GRANT EXECUTE ON OBJECT::[dbo].[Application_LoadData] TO [SSRSUserRole] AS [dbo];,这大概率是问题根源!当SSRS账号执行存储过程时,会尝试运行这条授权语句,但该账号既不是dbo,也没有被授予IMPERSONATE [dbo]的权限,导致执行AS [dbo]时失败,进而抛出“找不到用户'dbo'”的错误。本地Windows身份验证时你的账号可能有足够权限(比如是数据库管理员或dbo),所以执行这条语句没问题,但部署后的SSRS账号不具备这个权限。建议把这条GRANT语句从存储过程里移除——授权操作应该在存储过程外单独执行,而不是放在存储过程内部每次执行时都跑一遍。验证存储过程的执行上下文
检查存储过程的创建语句,看是否带有EXECUTE AS子句(比如CREATE PROCEDURE ... WITH EXECUTE AS 'someuser')。如果指定了某个执行身份,要确认该用户在数据库中存在,且SSRS账号有IMPERSONATE该用户的权限。如果EXECUTE AS的用户不存在或权限不足,也可能引发类似的身份报错。检查数据库用户的架构权限
虽然你给了角色执行存储过程的权限,但要确认SSRSUserRole是否对dbo架构有基础访问权限。可以尝试执行:GRANT SELECT ON SCHEMA::[dbo] TO [SSRSUserRole];有些情况下,即使有存储过程执行权限,如果没有对架构的访问权限,也可能触发奇怪的权限报错(比如找不到架构所有者)。
确认SSRS数据源的身份验证配置
排查报表服务器上的数据源设置:是否确实使用了你指定的登录账号?有没有可能配置成了“使用报表服务器服务账户”或者“Windows集成身份验证”(这时候会用报表服务器的服务账号而非你指定的账号)。可以在SSRS门户里编辑数据源,确认身份验证选项和账号信息是否正确。检查存储过程的对象引用
虽然你说存储过程是简单的内连接,但还是要确认所有引用的表/视图都明确指定了dbo架构(比如dbo.TableA而非TableA)。如果某个对象没有指定架构,SSRS账号的默认架构可能不是dbo,导致数据库尝试查找该账号默认架构下的对象,进而引发混淆报错。
内容的提问来源于stack exchange,提问作者Kevin

