最近,我一直在使用EXECUTE AS LOGIN来检查某个人是否可以在我们的数据库之一中使用表函数。测试表明他可以,但他一再报告失败。
该人使用登录名“ WEB”连接到数据库,并且该数据库中的用户“ WEB”与登录名“ WEB”相关联,因此我尝试了以下脚本:
-- part 1
EXECUTE AS USER = 'WEB'
GO
SELECT
USER_NAME() AS 'user_name'
,SUSER_NAME() AS 'suser_name'
,SUSER_SNAME() AS 'suser_sname'
,SYSTEM_USER AS 'system_user'
GO
REVERT
GO
和
-- part 2
EXECUTE AS LOGIN = 'WEB'
GO
SELECT
USER_NAME() AS 'user_name'
,SUSER_NAME() AS 'suser_name'
,SUSER_SNAME() AS 'suser_sname'
,SYSTEM_USER AS 'system_user'
GO
REVERT
GO
第一部分很好,其结果是:
网站| 网站| 网站| 网页
但是第二个结果有点令人困惑:
dbo | 网站| 网站| 网页
EXECUTE AS USER和EXECUTE AS LOGIN有什么区别,使第二个失败?此外,当然,第一个是数据库级别,第二个是服务器级别的模拟,这是我所了解的,在此不做说明。
第二个并不是“失败”,它只是告诉您登录名已分配了服务器角色(sysadmin)。您是否检查了用户所请求的架构?在dbo默认架构不是开发人员期望的默认架构之前。可以通过完全引用表格更好地修复代码
—
Stuart Moore