2012-02-10 73 views
2

我想写一个查询来告诉我某个用户可以访问的数据库中有哪些表。这是一个域用户,而不仅仅是一个SQL用户。查找用户帐户访问数据库中的表格

在此先感谢。

+0

这是SQL Server的?甲骨文? MySQL的? – RQDQ 2012-02-10 16:31:21

+0

SQL服务器,2005。 – Eric 2012-02-10 16:43:31

回答

0

假设你只有在用户/登录感兴趣,而非角色等你抢的信息,请依次如下:

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