Quantcast
Channel: Forum SQL Server Database Engine
Viewing all articles
Browse latest Browse all 15694

script for database users which are not mapped to any database roles

$
0
0

Hi All,

i tried a lot to manipulte the below script to include the users, which are not mapped to the any one the database role but no luck. ( this means, user existed in the database but doesnot mapped to any role)

The below script absoultly working fine, if the users are mapped to atleat one role.

Now I m looking for the script for the Database users which are not mapped to database roles, in the same output.

--=======================

WITH CTE AS (
   SELECT rm.member_principal_id,
          SUM(CASE WHEN r.name = 'db_datareader' THEN 1 END) AS reader,
          SUM(CASE WHEN r.name = 'db_datawriter' THEN 1 END) AS writer,
          SUM(CASE WHEN r.name = 'db_execute' THEN 1 END) AS execer,
          SUM(CASE WHEN r.name = 'db_ddladmin' THEN 1 END) AS ddladmin,
          SUM(CASE WHEN r.name = 'db_owner' THEN 1 END) AS dbowner,
          SUM(CASE WHEN r.name NOT IN ('public', 'db_datareader', 'db_datawriter',
                                       'db_execute', 'db_ddladmin', 'db_owner')
                   THEN 1
              END) AS other
   FROM   sys.database_role_members rm
   JOIN   sys.database_principals r ON r.principal_id = rm.role_principal_id
   GROUP  BY rm.member_principal_id
)
SELECT dp.name, db_name(), dp.type_desc, 'x' AS "public",
       CASE WHEN CTE.reader   >= 1 THEN 'X' ELSE ' ' END AS "Read",
       CASE WHEN CTE.writer   >= 1 THEN 'X' ELSE ' ' END AS "Write",
       CASE WHEN CTE.execer   >= 1 THEN 'X' ELSE ' ' END AS "Execute",
       CASE WHEN CTE.ddladmin >= 1 THEN 'X' ELSE ' ' END AS "DDL Admin",
       CASE WHEN CTE.dbowner  >= 1 THEN 'X' ELSE ' ' END AS "db_owner",
       CASE WHEN CTE.other    >= 1
            THEN (SELECT r.name + '; '
                  FROM   sys.database_role_members rm
                  JOIN   sys.database_principals r ON r.principal_id = rm.role_principal_id
                  WHERE  rm.member_principal_id = CTE.member_principal_id
                    AND  r.name NOT IN ('public', 'db_datareader', 'db_datawriter',
                                       'db_execute', 'db_ddladmin', 'db_owner')
                  FOR XML PATH(''))
            ELSE ''
       END AS "Other"
FROM   CTE
JOIN   sys.database_principals dp ON CTE.member_principal_id = dp.principal_id
ORDER  BY dp.name

-- =======================

Thanks,

Satish Kumar.


Thanks, Satish Kumar. Please mark as this post as answered if my anser helps you to resolves your issue :)


Viewing all articles
Browse latest Browse all 15694

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>