Як дізнатися * чому * користувач має певні ефективні дозволи?


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. Чи є інструмент або сценарій, який забезпечує цю функціональність?


чому ви не експортуєте його у файл txt ?, яку ОС ви використовуєте?
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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.