最近我一直在使用 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
第一部分很好,结果如下:
网站 | 网站 | 网站 | 网络
但第二个结果有点令人困惑:
德博 | 网站 | 网站 | 网络
EXECUTE AS USER 和 EXECUTE AS LOGIN 有什么区别导致第二个失败?此外,当然,第一个是数据库级别的,第二个是服务器级别的模拟,这是我所知道的,这里没有解释情况。
sysadmin
组的成员始终映射到dbo
,即使它在数据库中有显式用户。所以看起来登录WEB
是成员sysadmin
,因此在第二种情况下USER_NAME()
正确返回。dbo