Como descubro * por que * um usuário tem certas permissões efetivas?

14

Eu sei que posso consultar permissões efetivas usando 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          
 ...

Isso indica se o usuário atual tem permissões SELECT, INSERT, UPDATE etc. myTableno banco de dados myDatabase.

É possível descobrir facilmente por que o usuário tem essas permissões? Por exemplo, eu adoraria ter uma função fn_my_permissions_exque gera uma reasoncoluna adicional :

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
 ...

Infelizmente, não foi possível encontrar essa função na documentação do SQL Server. Existe uma ferramenta ou script que fornece essa funcionalidade?

Heinzi
fonte
por que você não o exporta para um arquivo txt ?, qual sistema operacional você está usando?
Jcho360
1
@ jcho360: Não há função fn_my_permission_ex, então não há nada que eu possa exportar. Estou perguntando se existe uma função ou ferramenta com essa funcionalidade .
Heinzi 16/05
você está usando SSMS?
Jcho360
1
Pergunta incrível. Eu tenho tentado descobrir isso por um tempo muito, muito longo. O fn_my_permissions meio que funciona, mas geralmente mostra permissões que não consigo rastrear até uma origem.
PseudoToad

Respostas:

8

Você pode encontrar algumas boas informações sobre segurança no artigo abaixo.

Revendo permissões do SQL Server | TechRepublic http://tek.io/KfzEyp

Exceto:

A consulta a seguir usa a visualização do sistema sys.database_permissions para indicar quais usuários tinham permissões específicas dentro do banco de dados atual.

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
fonte