Как я могу просмотреть все гранты для базы данных SQL? - PullRequest
13 голосов
/ 31 января 2009

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

Примечание: это может быть похоже на этот вопрос , но я не смог бы заставить работать решение для выбранного ответа (если бы кто-то мог предоставить лучший пример того, как его использовать, это также помогло бы)

Ответы [ 5 ]

17 голосов
/ 31 января 2009

Данное решение не распространяется на то, где предоставляется разрешение для схемы или самой базы данных, которые также предоставляют разрешения для таблиц. Это также даст вам такие ситуации. Вы можете использовать предложение WHERE для разрешения_имя, чтобы ограничиться просто УДАЛИТЬ.

SELECT 
    class_desc 
  , CASE WHEN class = 0 THEN DB_NAME()
         WHEN class = 1 THEN OBJECT_NAME(major_id)
         WHEN class = 3 THEN SCHEMA_NAME(major_id) END [Securable]
  , USER_NAME(grantee_principal_id) [User]
  , permission_name
  , state_desc
FROM sys.database_permissions

Кроме того, db_datawriter необходимо будет проверить на членство, поскольку он дает неявные права INSERT, UPDATE и DELETE, то есть вы не увидите его в DMV разрешений или их производных.

5 голосов
/ 31 января 2009

Для просмотра всех разрешений, которыми можно управлять, вы можете использовать функцию fn_my_permission. В этом запросе перечислены все разрешения на сервере :

select * from fn_my_permissions(NULL, NULL)

Вы должны войти в систему, используя учетную запись с ролью sysadmin.

Вы можете уточнить вызовы функций, используя следующие параметры.

Для всех разрешений для базы данных :

select * from fn_my_permissions(NULL, 'database')

Для всех разрешений в схеме dbo :

select * from fn_my_permissions('dbo', 'schema')

Для всех разрешений для таблицы :

select * from fn_my_permissions('dbo.test', 'object')
4 голосов
/ 12 февраля 2014

Мне понравился ответ К. Брайана Келли, но мне хотелось немного больше информации (например, схемы), а также генерации соответствующих операторов GRANT и REVOKE, чтобы я мог применять их в разных средах (например, dev / test / prod) .

обратите внимание, что вы можете легко исключить системные объекты, см. Комментарий где

select 
    class_desc 
    ,USER_NAME(grantee_principal_id) as user_or_role
    ,CASE WHEN class = 0 THEN DB_NAME()
          WHEN class = 1 THEN ISNULL(SCHEMA_NAME(o.uid)+'.','')+OBJECT_NAME(major_id)
          WHEN class = 3 THEN SCHEMA_NAME(major_id) END [Securable]
    ,permission_name
    ,state_desc
    ,'revoke ' + permission_name + ' on ' +
        isnull(schema_name(o.uid)+'.','')+OBJECT_NAME(major_id)+ ' from [' +
        USER_NAME(grantee_principal_id) + ']' as 'revokeStatement'
    ,'grant ' + permission_name + ' on ' +
        isnull(schema_name(o.uid)+'.','')+OBJECT_NAME(major_id)+ ' to ' +
        USER_NAME(grantee_principal_id) + ']' as 'grantStatement'
FROM sys.database_permissions dp
LEFT OUTER JOIN sysobjects o
    ON o.id = dp.major_id
-- where major_id >= 1  -- ignore sysobjects

order by 
    class_desc desc
    ,USER_NAME(grantee_principal_id)
    ,CASE WHEN class = 0 THEN DB_NAME()
         WHEN class = 1 THEN isnull(schema_name(o.uid)+'.','')+OBJECT_NAME(major_id)
         WHEN class = 3 THEN SCHEMA_NAME(major_id) end
    ,permission_name
4 голосов
/ 31 января 2009

Для просмотра всех грантов в конкретной базе данных используйте это:

Select * from INFORMATION_SCHEMA.TABLE_PRIVILEGES

Чтобы просто просмотреть удаление грантов в конкретной базе данных, используйте это:

Select * from INFORMATION_SCHEMA.TABLE_PRIVILEGES WHERE PRIVILEGE_TYPE = 'DELETE'
2 голосов
/ 31 января 2009

Чтобы просмотреть гранты для всей БД, выберите нужную БД, откройте новое окно запроса, введите - sp_helprotect, выполните запрос

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