Недавно я использовал 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
Первая часть была в порядке с результатом:
WEB | WEB | WEB | WEB
Но второй результат был немного запутанным:
дбо | WEB | WEB | WEB
Какая разница между EXECUTE AS USER и EXECUTE AS LOGIN, которая приводит к сбою второго? Кроме того, конечно, первый - это уровень базы данных, а второй - олицетворение на уровне сервера, о чем я знаю и не объясняю ситуацию здесь.