Как запросить определенные права доступа пользователя - PullRequest
4 голосов
/ 18 декабря 2009

У меня есть старая база данных, которую я наследую. Права доступа нигде не определены четко, и я ищу быстрый способ получить их для всех. Допустим, у меня есть пользователь в моей базе данных, который не принадлежит ни к какой роли членства. Тем не менее, им был предоставлен доступ к конкретным таблицам. Например, они могут выполнять запросы на выборку в таблице X и выполнять запросы на обновление в таблице Y. Я знаю, что могу узнать, что у них есть, перейдя в свойства для каждого пользователя. Однако я хотел бы представить, что где-то должна быть системная таблица, в которой все это определено и что ее можно легко запрашивать. Как будет выглядеть этот запрос.

К вашему сведению: я работаю с SQL Server 2005

Обновление: есть ли способ сделать это для всех баз данных на сервере?

Ответы [ 2 ]

5 голосов
/ 18 декабря 2009

Взгляните на Представления каталога безопасности , а затем посмотрите ответ MrDenny здесь , который дает запрос для перечисления прав пользователя. Я воспроизвожу это здесь (приведено в порядок по моему вкусу) ..

SELECT  [Schema]            =   sys.schemas.name 
,       [Object]            =   sys.objects.name 
,       username            =   sys.database_principals.name 
,       permissions_type    =   sys.database_permissions.type 
,       permission_name     =   sys.database_permissions.permission_name
,       permission_state    =   sys.database_permissions.state 
,       state_desc          =   sys.database_permissions.state_desc
,       permissionsql       =   state_desc + ' ' + permission_name 
                                 + ' on ['+ sys.schemas.name + '].[' + sys.objects.name 
                                 + '] to [' + sys.database_principals.name + ']' 
                                  COLLATE LATIN1_General_CI_AS 
FROM sys.database_permissions 
 INNER JOIN sys.objects ON sys.database_permissions.major_id =      sys.objects.object_id 
 INNER JOIN sys.schemas ON sys.objects.schema_id = sys.schemas.schema_id 
 INNER JOIN sys.database_principals ON sys.database_permissions.grantee_principal_id =  sys.database_principals.principal_id 
ORDER BY 1, 2, 3, 5
3 голосов
/ 18 декабря 2009

Все немного сложнее на самом деле. Действующие разрешения представляют собой комбинацию внутренних разрешений базы данных (запрашиваемых как запрос Денни, показанный выше с помощью doza) и членство в группе Windows. Позже, к сожалению, эта информация хранится вне SQL в схеме AD, поэтому вы не можете запросить ее.

Таким образом, если ваша цель состоит в том, чтобы отобразить 'Доступ к таблице X предоставляется домену \ someuser и domain \ somegroup и запрещен для домена \ someothergroup', тогда вы можете использовать метаданные каталога и запросить их, как показано в посте Дозы.

Однако, если ваша цель - ответить «Имеет ли пользовательский домен \ someuser доступ к таблице X?» Вы не можете получить ответ из запроса выше. Это верно, несмотря на то, что вы видите запись о том, что домен \ someuser имеет доступ, вы не можете ответить, если он имеет эффективный доступ. Помните, что одно запрещение превосходит все права, и если домен \ пользователь является членом группы домен \ someothergroup, тогда домену \ someuser фактически отказано в доступе.

Чтобы ответить на следующий вопрос, вы должны использовать другой механизм, а именно вы должны выдать себя за пользователя на уровне SQL и проверить разрешение с помощью HAS_PERM_BY_NAME :

EXECUTE AS USER = 'domain\someuser';
SELECT HAS_PERMS_BY_NAME('X','TABLE','SELECT');
REVERT;

Стоит отметить, что на первый вопрос может ответить любой, имеющий права просмотра в каталогах безопасности, в то время как последнему требуется разрешение для олицетворения, гораздо более мощная привилегия.

...