Как написать SQL-запрос, чтобы узнать, какие учетные записи были предоставлены и какие права в Sql Server 2005? - PullRequest
2 голосов
/ 15 сентября 2008

Я отвечаю за некоторые тестовые серверы баз данных. Исторически слишком много других людей имеют к ним доступ. Они работают на SQL Server 2005. Я пишу запросы и заключаю их в сценарии, чтобы я мог проводить регулярный аудит прав. Было хорошо узнать, какие пользователи имеют права администратора на самом сервере, а также выяснить, кто имеет роль 'sysadmin' в их логине - это был запрос в одну строку для последнего.

Но как узнать, какие логины имеют сопоставление пользователей с конкретной (или любой) базой данных? Я могу найти таблицы sys.database_principals и sys.server_principals. Я нашел таблицу sys.databases. Я не разобрался, как узнать, какие пользователи имеют права на базу данных, и если да, то что. Каждый поиск в Google выводит людей вручную с помощью панели «Сопоставление пользователей» диалогового окна «Вход», а не с помощью запроса для этого. Есть идеи?

Ответы [ 3 ]

2 голосов
/ 16 сентября 2008

Ознакомьтесь с этой справочной статьей msdn на Has_Perms_By_Name . Я думаю, что вы действительно заинтересованы в примерах D, F и G


Другая идея ... Я запустил SQL Profiler и нажал на ObjectExplorer-> Security-> Users. Это привело к (приблизительно) следующему запросу.

SELECT *
FROM
  sys.database_principals AS u
  LEFT OUTER JOIN sys.database_permissions AS dp
  ON dp.grantee_principal_id = u.principal_id and dp.type = N'CO'
WHERE (u.type in ('U', 'S', 'G', 'C', 'K'))
ORDER BY [Name] ASC
1 голос
/ 16 сентября 2008

Вот как это сделать. Я нашел ссылку на спрока в документах MSDN. Я извлек это из sproc и обернул его в цикл из всех баз данных, известных экземпляру.

select DbRole = g.name, MemberName = u.name
  from @NAME.sys.database_principals u, @NAME.sys.database_principals g, @NAME.sys.database_role_members m
  where   g.principal_id = m.role_principal_id
    and u.principal_id = m.member_principal_id
    and g.name in (''db_ddladmin'', ''db_owner'', ''db_securityadmin'') 
    and u.name not in (''dbo'')
  order by 1, 2

Это затем сообщает пользователям, у которых есть DBO, которые, возможно, не должны. Я уже отозвал некоторые права администратора от некоторых пользователей, которые им не нужны. Спасибо всем!

1 голос
/ 16 сентября 2008

select * from Master.dbo.syslogins l inner join sys.sysusers u on l.sid = u.sid

Это даст вам информацию о том, какие пользователи сопоставлены с какими входами в одну базу данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...