SQL Сервер ВЫПОЛНИТЕ КАК неправильное поведение - PullRequest
1 голос
/ 03 апреля 2020

У меня есть пользователь, которому я предоставил доступ к учетным данным, используя:

GRANT ALTER ANY CREDENTIAL TO userA

Когда я вхожу в систему с этим пользователем, следующее возвращает мне данные

SELECT * FROM sys.credentials

Я вижу что у меня есть разрешение на уровне SERVER. Это можно проверить, выполнив

SELECT * FROM fn_my_permissions (NULL, 'SERVER')

Используя другого пользователя, скажем, userB, я дал олицетворение userA, выполнив

GRANT IMPERSONATE ON USER::userA TO userB

В хранимой процедуре, во время входа в систему как userB, я переключить контекст на userA

EXECUTE AS user = 'userA'
SELECT user_name() AS ContextUserName
SELECT * FROM fn_my_permissions (NULL, 'SERVER')
SELECT * FROM sys.credentials

SELECT * FROM fn_my_permissions (NULL, 'SERVER') не возвращает мне разрешения ALTER ANY CREDENTIAL. SELECT * FROM sys.credentials не возвращает мне никаких значений. SELECT user_name() возвращает мне userA однако.

Есть что-то, что я здесь пропустил? Почему я не могу вести себя как userA и получать данные из sys.credentials?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

Как упоминал Матиас, я был Executing AS ПОЛЬЗОВАТЕЛЕМ, а не ЛОГИНОМ. Мне нужно было GRANT IMPERSONATE ON LOGIN::, чтобы это сработало.

0 голосов
/ 03 апреля 2020

Возможно, проблема в том, что EXECUTE AS только предоставляет UserB разрешения UserA для базы данных, в которой вы ее выполняете, но не разрешения, данные на сервере. Вот почему SELECT user_name() показывает UserA, но SELECT * FROM fn_my_permissions (NULL, 'SERVER') показывает не разрешения UserA, а разрешения UserB.

Документы Microsoft:

EXECUTE AS (Transact- SQL)"Область олицетворения ограничена текущей базой данных. Переключение контекста на пользователя базы данных не наследует разрешения этого пользователя на уровне сервера."

sys.fn_my_permissions"SELECT * FROM fn_my_permissions(NULL, 'SERVER'); возвращает список действующих разрешений вызывающей стороны на сервере ."

...