Нещодавно я використовую 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
Яка різниця між ВИКОНАННЯМ ТА КОРИСТУВАЧОМ ТА ВИКОРИСТАННЯ ЯК ВХОД, що робить другий невдалим? Крім того, звичайно, перший - рівень бази даних, а другий - імперсонація на рівні сервера, про що я знаю і не пояснює ситуацію тут.