Как мне узнать, * почему * у пользователя есть определенные действующие разрешения?

14

Я знаю, что могу запросить эффективные разрешения с помощью sys.fn_my_permissions:

USE myDatabase;
SELECT * FROM fn_my_permissions('dbo.myTable', 'OBJECT') 

 entity_name | subentity_name | permission_name 
------------------------------------------------
 dbo.myTable |                | SELECT          
 dbo.myTable |                | UPDATE          
 ...

Это говорит мне, имеет ли текущий пользователь разрешения SELECT, INSERT, UPDATE и т. Д. myTableВ базе данных myDatabase.

Можно ли легко узнать, почему у пользователя есть такие разрешения? Например, я хотел бы иметь функцию, fn_my_permissions_exкоторая выводит дополнительный reasonстолбец:

USE myDatabase;
SELECT * FROM fn_my_permissions_ex('dbo.myTable', 'OBJECT') 

 entity_name | subentity_name | permission_name | reason
------------------------------------------------------------------------------------------------------------------------------------
 dbo.myTable |                | SELECT          | granted to database role public
 dbo.myTable |                | UPDATE          | member of group MYDOMAIN\Superusers, which belongs to database role db_datawriter
 ...

К сожалению, я не смог найти такую ​​функцию в документации по SQL Server. Есть ли инструмент или скрипт, который обеспечивает эту функциональность?

Heinzi
источник
почему вы не экспортируете его в текстовый файл ?, какую операционную систему вы используете?
jcho360
1
@ jcho360: Там нет функции fn_my_permission_ex, поэтому я ничего не могу экспортировать. Я спрашиваю, есть ли функция или инструмент с этой функциональностью .
Хайнци
вы используете SSMS?
jcho360
1
Внушительный вопрос. Я пытался понять это очень и очень долго. fn_my_permissions вроде работает, но часто показывает разрешения, которые я не могу отследить до источника.
PseudoToad

Ответы:

8

Вы можете найти хорошую информацию о безопасности в статье ниже.

Проверка разрешений SQL Server | TechRepublic http://tek.io/KfzEyp

Кроме:

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

SELECT
        dp.class_desc
       ,dp.permission_name
       ,dp.state_desc
       ,ObjectName = OBJECT_NAME(major_id)
       ,GranteeName = grantee.name
       ,GrantorName = grantor.name
    FROM
        sys.database_permissions dp
        JOIN sys.database_principals grantee
        ON dp.grantee_principal_id = grantee.principal_id
        JOIN sys.database_principals grantor
        ON dp.grantor_principal_id = grantor.principal_id
jgardner04
источник