¿Cómo puedo saber * por qué * un usuario tiene ciertos permisos efectivos?


14

Sé que puedo consultar permisos efectivos 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          
 ...

Esto me dice si el usuario actual tiene permisos SELECT, INSERT, UPDATE, etc. myTableen la base de datos myDatabase.

¿Es posible descubrir fácilmente por qué el usuario tiene estos permisos? Por ejemplo, me encantaría tener una función fn_my_permissions_exque genere una reasoncolumna 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
 ...

Desafortunadamente, no pude encontrar dicha función en la documentación de SQL Server. ¿Existe alguna herramienta o script que brinde esta funcionalidad?


¿por qué no lo exportas a un archivo txt ?, ¿qué sistema operativo estás usando?
jcho360

1
@ jcho360: No hay función fn_my_permission_ex, por lo que no hay nada que pueda exportar. Estoy preguntando si hay una función o herramienta con esa funcionalidad .
Heinzi

¿Estás usando SSMS?
jcho360

1
Impresionante pregunta. He estado tratando de resolver esto durante mucho, mucho tiempo. fn_my_permissions funciona un poco, pero a menudo muestra permisos que no puedo rastrear hasta un origen.
PseudoToad

Respuestas:


8

Puede encontrar buena información sobre seguridad en el artículo a continuación.

Revisión de permisos de SQL Server | TechRepublic http://tek.io/KfzEyp

Excepto:

La siguiente consulta utiliza la vista del sistema sys.database_permissions para indicar qué usuarios tenían permisos específicos dentro de la base de datos actual.

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.