Recientemente he estado usando EJECUTAR COMO INICIAR SESIÓN para verificar si cierta persona podría o no usar una función de tabla en una de nuestras bases de datos. Las pruebas mostraron que podía pero él reportó repetidamente el fracaso.
La persona usa el inicio de sesión 'WEB' para conectarse a la base de datos y tiene el usuario 'WEB' en esa base de datos asociado con el inicio de sesión 'WEB', así que probé los siguientes 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
y
-- 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
La primera parte estuvo bien con el resultado de:
WEB | WEB | WEB | WEB
Pero el segundo resultado fue un poco confuso:
dbo | WEB | WEB | WEB
¿Cuál es la diferencia entre EJECUTAR COMO USUARIO y EJECUTAR COMO INICIAR SESIÓN que hace que el segundo falle? Además, por supuesto, el primero es el nivel de la base de datos y el segundo es la suplantación del nivel del servidor, de lo que soy consciente y no explica la situación aquí.