У меня следующий запрос SQL Server:
SELECT dbp2.name AS nombre
FROM sys.server_principals AS sp JOIN
sys.database_principals AS dbp ON sp.sid=dbp.sid JOIN
sys.database_role_members AS dbrm ON dbp.principal_Id=dbrm.member_principal_Id JOIN
sys.database_principals AS dbp2 ON dbrm.role_principal_id=dbp2.principal_id
WHERE dbp.name = SUSER_NAME() AND dbp2.name NOT LIKE 'db_%';
Возвращает роли базы данных, к которой принадлежит текущий пользователь, и я использую эту информацию для проверки разрешений внутри своего приложения (я использую только пользователей Windows).По неизвестной причине этот запрос возвращает пустой для обычного пользователя, но если я выполню этот запрос как пользователь sysadmin, меняющий SUSER_SNAME () на пользователя, которого я хочу, он возвращает данные.После нескольких тестов я обнаружил, что когда я вошел в систему как пользователь без привилегий sysadmin, системное представление sys.server_principals не возвращает собственный логин пользователя, поэтому соединение с другими представлениями не возвращает данных.В документации Microsoft об этом системном представлении говорится, что
Любой вход в систему может видеть свое собственное имя входа в систему, системные входы и фиксированные роли сервера
Фактически, запросвозвращает системные логины и фиксированные роли сервера, но не имеет собственного логина пользователя.Я пытался найти какую-либо подсказку, почему это происходит без удачи.До сих пор я тестировал это поведение в SQL 2014/2016 в Windows 7/8/10 или Windows Server 2012 с тем же результатом.
Ожидаемый результат запроса sys.server_principals должен выглядеть следующим образом:
- sa
- public
- sysadmin
- securityadmin
- serveradmin
- setupadmin
- processadmin
- diskadmin
- dbcreator
- bulkadmin
- DOMAIN \ UserName
Есть ли какая-либо конфигурация, которую я должен предоставить пользователю на уровне домена или на уровне SQL Server, чтобы этот запрос работал?Заранее спасибо за любую помощь.