2009-01-30 4 views
10

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

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

ответ

15

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

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 права, то есть вы не увидите, что он появляется в DMVs разрешения или их производных.

4

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

Select * from INFORMATION_SCHEMA.TABLE_PRIVILEGES 

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

Select * from INFORMATION_SCHEMA.TABLE_PRIVILEGES WHERE PRIVILEGE_TYPE = 'DELETE' 
2

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

+2

sp_helprotect осуждается в SQL Server 2005 и более поздних версий. См. Http://msdn.microsoft.com/en-us/library/ms190310.aspx –

3

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

select * from fn_my_permissions(NULL, NULL) 

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

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

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

select * from fn_my_permissions(NULL, 'database') 

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

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

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

select * from fn_my_permissions('dbo.test', 'object') 
4

Мне понравился ответ от К. Брайана Келли, но мне хотелось получить дополнительную информацию (например, схему), а также создать соответствующие инструкции 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