Поиск учетной записи пользователя для доступа к таблицам в БД - PullRequest
2 голосов
/ 10 февраля 2012

Я пытаюсь написать запрос, чтобы сказать, к каким таблицам в базе данных может обращаться определенный пользователь.Это пользователь домена, а не просто пользователь SQL.

Заранее спасибо.

1 Ответ

0 голосов
/ 28 февраля 2012

Предполагая, что вы интересуетесь только пользователями / логинами, а не ролями и т. Д., Вы получаете следующую информацию:

WITH    RootPermissions
          AS ( SELECT   USER_NAME(p.grantee_principal_id) AS UserName ,
                        dp.principal_id ,
                        dp.type_desc AS UserType ,
                        OBJECT_NAME(p.major_id) AS ObjectName ,
                        p.class_desc AS ObjectType ,
                        p.permission_name AS Permission,
                        p.state_desc AS PermissionState
               FROM     sys.database_permissions AS p
                        INNER JOIN sys.database_principals AS dp ON p.grantee_principal_id = dp.principal_id
             ),
        UnionResults ( UserName, UserType, ObjectName, ObjectType, Permission, PermissionState, role_name )
          AS ( SELECT   UserName ,
                        UserType ,
                        ObjectName ,
                        ObjectType ,
                        Permission ,
                        PermissionState ,
                        CAST(NULL AS SYSNAME) AS role_name
               FROM     RootPermissions AS p
               WHERE    ( UserType <> 'DATABASE_ROLE' )
               UNION
               SELECT   rm.member_principal_name ,
                        rm.principal_type_desc ,
                        p.ObjectType ,
                        p.ObjectName ,
                        p.Permission ,
                        p.PermissionState ,
                        rm.role_name
               FROM     RootPermissions AS p
                        RIGHT OUTER JOIN ( SELECT   rm.role_principal_id ,
                                                    dp.type_desc AS principal_type_desc ,
                                                    rm.member_principal_id ,
                                                    USER_NAME(rm.member_principal_id) AS member_principal_name ,
                                                    USER_NAME(rm.role_principal_id) AS role_name
                                           FROM     sys.database_role_members AS rm
                                                    INNER JOIN sys.database_principals AS dp ON rm.member_principal_id = dp.principal_id
                                         ) AS rm ON rm.role_principal_id = p.principal_id
             )
    SELECT  ObjectName ,
            UserName ,
            ObjectType ,
            UserType ,
            Permission ,
            PermissionState ,
            role_name
    FROM    UnionResults
    WHERE   ( ObjectName IS NOT NULL )
    ORDER BY ObjectName ,
            UserName
...