Запрос к sys.server_principals не возвращает собственный логин

У меня есть следующий запрос 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). По неизвестной причине этот запрос возвращается пустым для обычного пользователя, но если я выполню этот запрос как пользователь сисадмина, меняя SUSER_SNAME() на пользователя, которого я хочу, он возвращает данные. После нескольких тестов я обнаружил, что когда я вошел в систему как пользователь без привилегий sysadmin, системное представление sys.server_principals не возвращает собственный логин пользователя, поэтому соединение с другими представлениями не возвращает данных. В документации Microsoft об этом виде системы указано, что

Любой логин может видеть свое собственное логин, системные логины и фиксированные роли сервера

Фактически, запрос возвращает системные логины и фиксированные роли сервера, но не имеет собственного логина пользователя. Я пытался найти какую-либо подсказку, почему это происходит без удачи. До сих пор я тестировал это поведение в SQL 2014/2016 в Windows 7/8/10 или Windows Server 2012 с тем же результатом.

Ожидаемый результат от запроса sys.server_principals должен быть таким:

  • са
  • общественности
  • сисадмин
  • securityadmin
  • ServerAdmin
  • setupadmin
  • processadmin
  • diskadmin
  • DBCreator
  • bulkadmin
  • ДОМЕН \ имя_пользователя

Есть ли какая-либо конфигурация, которую я должен предоставить пользователю на уровне домена или на уровне SQL Server, чтобы этот запрос работал? Заранее благодарю за любую помощь.

1 ответ

После многих попыток я обнаружил, что проблема в базе данных. Я выполнил это заявление:

ALTER DATABASE XXX SET TRUSTWORTHY ON

Это решило мою проблему. Однако, это решение немного горькое, потому что этот запрос должен работать без каких-либо дополнительных разрешений согласно документации.

Другие вопросы по тегам