запрос к sys.server_principals не возвращает собственный логин - PullRequest
0 голосов
/ 26 июня 2018

У меня следующий запрос 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, чтобы этот запрос работал?Заранее спасибо за любую помощь.

1 Ответ

0 голосов
/ 27 июня 2018

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

ALTER DATABASE XXX SET TRUSTWORTHY ON

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

...