EXECUTE AS USER 和 EXECUTE AS LOGIN 之间的区别是什么使第二个行为异常?

gem*_*igo 10 sql-server-2008 security

最近我一直在使用 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
Run Code Online (Sandbox Code Playgroud)

-- 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
Run Code Online (Sandbox Code Playgroud)

第一部分很好,结果如下:

网站 | 网站 | 网站 | 网络

但是第二个结果有点令人困惑:

dbo | 网站 | 网站 | 网络

EXECUTE AS USER 和 EXECUTE AS LOGIN 之间的区别是什么导致第二个失败?此外,当然,第一个是数据库级别,第二个是服务器级别的模拟,这是我所知道的,这里不解释情况。

Rem*_*anu 8

sysadmin组的成员始终映射到dbo,即使它在数据库中具有显式用户。所以看起来登录名WEB是 的成员sysadmin,因此在第二种情况下USER_NAME()正确返回dbo