Recentemente, tenho usado EXECUTE AS LOGIN para verificar se uma determinada pessoa pode ou não usar uma função de tabela em um de nossos bancos de dados. Os testes mostraram que ele podia, mas ele relatou repetidamente falhas.
A pessoa usa o login 'WEB' para conectar-se ao banco de dados e ele tem o usuário 'WEB' nesse banco de dados associado ao login 'WEB', então tentei os seguintes scripts:
-- 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
e
-- 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
A primeira parte foi boa com o resultado de:
WEB WEB WEB REDE
Mas o segundo resultado foi um pouco confuso:
dbo WEB WEB REDE
Qual é a diferença entre EXECUTE AS USER e EXECUTE AS LOGIN que faz com que o segundo falhe? Além disso, é claro, o primeiro é o nível do banco de dados e o segundo é a representação no nível do servidor, do que estou ciente e não explica a situação aqui.