可以使用 AS { LOGIN | USER } = ' name ' 子句切换动态语句的执行上下文。当将上下文切换指定为 EXECUTE ('string') AS <context_specification> 时,上下文切换的持续时间限制为执行查询的范围。有关详细信息,请参阅了解上下文切换。指定用户名或登录名 在 AS { LOGIN | USER } = ' name ' 中指定的用户或登录名必须分别为 sys.database_principals 或 sys.server_principals 的主体,否则语句将失败。此外,还必须为该主体授予 IMPERSONATE 权限。除非调用方是数据库所有者或是 sysadmin 固定服务器角色的成员,否则当用户使用 Windows 组成员身份访问数据库或 SQL Server 的实例时,必须存在主体。例如,假设条件如下:CompanyDomain\SQLUsers 组具有对 Sales 数据库的访问权限。 CompanyDomain\SqlUser1 是 SQLUsers 的成员,因此具有对 Sales 数据库的隐式访问权限。 尽管 CompanyDomain\SqlUser1 使用 SQLUsers 组的成员身份有访问数据库的权限, EXECUTE @string_variable AS USER = 'CompanyDomain\SqlUser1' 语句也会失败,因为 CompanyDomain\SqlUser1 不是数据库中的主体。
谢谢zjcxc,我有看过您的2005 深入浅出,受益匪浅
--更改登录用户 EXECUTE AS LOGIN = 'jgj\administrator' --查看登录名 select spid,loginame from master..sysprocesses where spid=@@spid--更改登录用户 EXECUTE AS LOGIN = 'sasa' --查看登录名 select spid,loginame from master..sysprocesses where spid=@@spid
EXECUTE AS LOGIN ..
EXECUTE AS USER ..
EXECUTE AS LOGIN = 'sa'
在 AS { LOGIN | USER } = ' name ' 中指定的用户或登录名必须分别为 sys.database_principals 或 sys.server_principals 的主体,否则语句将失败。此外,还必须为该主体授予 IMPERSONATE 权限。除非调用方是数据库所有者或是 sysadmin 固定服务器角色的成员,否则当用户使用 Windows 组成员身份访问数据库或 SQL Server 的实例时,必须存在主体。例如,假设条件如下:CompanyDomain\SQLUsers 组具有对 Sales 数据库的访问权限。
CompanyDomain\SqlUser1 是 SQLUsers 的成员,因此具有对 Sales 数据库的隐式访问权限。
尽管 CompanyDomain\SqlUser1 使用 SQLUsers 组的成员身份有访问数据库的权限, EXECUTE @string_variable AS USER = 'CompanyDomain\SqlUser1' 语句也会失败,因为 CompanyDomain\SqlUser1 不是数据库中的主体。
谢谢zjcxc,我有看过您的2005 深入浅出,受益匪浅
EXECUTE AS LOGIN = 'jgj\administrator'
--查看登录名
select spid,loginame from master..sysprocesses where spid=@@spid--更改登录用户
EXECUTE AS LOGIN = 'sasa'
--查看登录名
select spid,loginame from master..sysprocesses where spid=@@spid