Wednesday, April 22, 2020

SQL Server Permission

 

Query to List SQL Server Logins with Their Server-Level Roles

In SQL Server, it’s often necessary to audit or review logins and determine what server-level roles are assigned to each. The following query retrieves a list of all SQL Server logins, along with flags indicating whether each login is a member of a particular server role (such as sysadmin, securityadmin, serveradmin, etc.).

This script uses a Common Table Expression (CTE) to pivot role membership data into columns, making it easy to view role assignments at a glance.

SQL Query

WITH cte_srm AS (
  SELECT
    srm.member_principal_id,
    MAX(CASE WHEN srm.role_principal_id = 3 THEN 1 END) AS sysadmin,
    MAX(CASE WHEN srm.role_principal_id = 4 THEN 1 END) AS securityadmin,
    MAX(CASE WHEN srm.role_principal_id = 5 THEN 1 END) AS serveradmin,
    MAX(CASE WHEN srm.role_principal_id = 6 THEN 1 END) AS setupadmin,
    MAX(CASE WHEN srm.role_principal_id = 7 THEN 1 END) AS processadmin,
    MAX(CASE WHEN srm.role_principal_id = 8 THEN 1 END) AS diskadmin,
    MAX(CASE WHEN srm.role_principal_id = 9 THEN 1 END) AS dbcreator,
    MAX(CASE WHEN srm.role_principal_id = 10 THEN 1 END) AS bulkadmin
  FROM sys.server_principals AS sp
  JOIN sys.server_role_members AS srm 
    ON sp.principal_id = srm.role_principal_id
  WHERE sp.[type] = 'R'
  GROUP BY srm.member_principal_id
)

SELECT
  pr.[sid],
  CAST(NULL AS SMALLINT) AS [status],
  pr.create_date,
  pr.modify_date AS updatedate,
  pr.create_date AS accdate,
  0 AS totcpu,
  0 AS totio,
  0 AS spacelimit,
  0 AS timelimit,
  0 AS resultlimit,
  pr.[name],
  pr.default_database_name AS dbname,
  CAST(NULL AS SYSNAME) AS [password],
  pr.default_language_name AS [language],
  CAST(CASE WHEN pe.state = 'D' THEN 1 ELSE 0 END AS INT) AS denylogin,
  CAST(CASE WHEN pe.state = 'G' THEN 1 ELSE 0 END AS INT) AS hasaccess,
  CAST(CASE WHEN pr.[type] IN ('U', 'G') THEN 1 ELSE 0 END AS INT) AS isntname,
  CAST(CASE WHEN pr.[type] = 'G' THEN 1 ELSE 0 END AS INT) AS isntgroup,
  CAST(CASE WHEN pr.[type] = 'U' THEN 1 ELSE 0 END AS INT) AS isntuser,
  ISNULL(cte_srm.sysadmin, 0) AS sysadmin,
  ISNULL(cte_srm.securityadmin, 0) AS securityadmin,
  ISNULL(cte_srm.serveradmin, 0) AS serveradmin,
  ISNULL(cte_srm.setupadmin, 0) AS setupadmin,
  ISNULL(cte_srm.processadmin, 0) AS processadmin,
  ISNULL(cte_srm.diskadmin, 0) AS diskadmin,
  ISNULL(cte_srm.dbcreator, 0) AS dbcreator,
  ISNULL(cte_srm.bulkadmin, 0) AS bulkadmin,
  pr.[name] AS loginname
FROM sys.server_principals AS pr
LEFT OUTER JOIN sys.server_permissions AS pe 
  ON pr.principal_id = pe.grantee_principal_id AND pe.[type] = 'COSQ'
LEFT OUTER JOIN cte_srm 
  ON pr.principal_id = cte_srm.member_principal_id
WHERE pr.[type] <> 'R';
GO

Summary

This query provides a comprehensive overview of each SQL Server login, including:

  • Login metadata (creation date, default database, language)
  • Access status (denied login, granted access)
  • Role membership (server-level roles shown as 0 or 1)

You can use or adapt this script for server audits, role reviews, or security assessments.

Popular Posts