T-SQL to list all the user mappings with database roles/permissions for a Login

前端 未结 7 2564
无人及你
无人及你 2020-12-06 05:09

I am looking for a t-sql script which can list the databases and and the respective roles/privileges mapped for a particular user. Using SQL Server 2008 R2.

7条回答
  •  情歌与酒
    2020-12-06 05:54

    I wrote a little query to find permission of a user on a specific database.

        SELECT * FROM   
        (
        SELECT 
        perm.permission_name AS 'PERMISSION'
        ,perm.state_desc AS 'RIGHT'
        ,perm.class_desc AS 'RIGHT_ON'
        ,p.NAME AS 'GRANTEE'
        ,m.NAME AS 'USERNAME'
        ,s.name AS 'SCHEMA'
        ,o.name AS 'OBJECT'
        ,IIF(perm.class = 0, db_name(), NULL) AS 'DATABASE'
        FROM
        sys.database_permissions perm
        INNER JOIN sys.database_principals p ON p.principal_id = perm.grantee_principal_id
        LEFT JOIN sys.database_role_members rm ON rm.role_principal_id = p.principal_id
        LEFT JOIN sys.database_principals m ON rm.member_principal_id = m.principal_id
        LEFT JOIN sys.schemas s ON perm.class = 3 AND perm.major_id = s.schema_id
        LEFT JOIN sys.objects AS o ON perm.class = 1 AND perm.major_id = o.object_id
        UNION ALL
        SELECT 
        perm.permission_name AS 'PERMISSION'
        ,perm.state_desc AS 'RIGHT'
        ,perm.class_desc AS 'RIGHT_ON'
        ,'SELF-GRANTED' AS 'GRANTEE'
        ,p.NAME AS 'USERNAME'
        ,s.name AS 'SCHEMA'
        ,o.name AS 'OBJECT'
        ,IIF(perm.class = 0, db_name(), NULL) AS 'DATABASE'
        FROM
        sys.database_permissions perm
        INNER JOIN sys.database_principals p ON p.principal_id = perm.grantee_principal_id
        LEFT JOIN sys.schemas s ON perm.class = 3 AND perm.major_id = s.schema_id
        LEFT JOIN sys.objects AS o ON perm.class = 1 AND perm.major_id = o.object_id
        ) AS [union]
        WHERE [union].USERNAME = 'Username' -- Username you will search for
        ORDER BY [union].RIGHT_ON, [union].PERMISSION, [union].GRANTEE
    

    The permissions of fixed database roles do not appear in sys.database_permissions. Therefore, database principals may have additional permissions not listed here.

    I does not prefer

        EXECUTE AS USER = 'userName';
        SELECT * FROM fn_my_permissions(NULL, 'DATABASE') 
    

    Because it's just retrieving which permissions the user has not where they come from!

    Maybe i find out how to join the fixed database roles permission granted for the user one day...

    Pls enjoy Life and hate the Users :D

提交回复
热议问题