2015-09-30 51 views
0

我必須獲得所有SQL Server登錄名(SQL 2005+)及其服務器角色的輸出,但對於每次登錄,我需要在一行中列出的角色,例如:SQL Server查詢以獲取用戶和相關角色在一行上列出

HOSTNAME USERNAME DESC   ROLES 
server  sa   SQL_LOGIN  sysadmin 
server  john  SQL_LOGIN  dbcreator,securityadmin 
server  DOMAIN\jack WINDOWS_LOGIN diskadmin,setupadmin,dbcreator 

回答

0

一個例子這應該符合您的期望:

SELECT sp.name, 
     sp.type_desc, 
     (
     SELECT sp2.name + ',' AS [text()] 
     FROM sys.server_role_members srm as rolename 
      LEFT JOIN sys.server_principals sp2 ON srm.role_principal_id = sp2.principal_id 
     WHERE srm.member_principal_id = sp.principal_id FOR XML PATH ('') 
     )  
FROM 
sys.server_principals sp 
+0

它很好用!謝謝 – merfe

0

下面是https://www.mssqltips.com/sqlservertip/2026/tables-and-views-for-auditing-sql-server-logins/

SELECT 
    sp1.[name] AS 'login' 
    , sp2.[name] AS 'role' 
FROM sys.server_principals sp1 
    JOIN sys.server_role_members srm 
    ON sp1.principal_id = srm.member_principal_id 
    JOIN sys.server_principals sp2 
    ON srm.role_principal_id = sp2.principal_id 
+0

這並沒有解決我的問題..有相同的SQL Server登錄帳戶中列出的所有角色的一個單行。這個列表爲sql server登錄每個角色列出了一行 – merfe

+0

我現在明白你更關心連接@Eralper發佈的答案中的角色。 – Morpheus

1

添加上dbagley的建議SQL string concatenation邏輯,我準備了下面的SELECT語句

;with cte as (
SELECT 
    sp1.[name] USERNAME 
    , sp1.type_desc [DESC] 
    , sp2.[name] ROLES 
FROM sys.server_principals sp1 
    JOIN sys.server_role_members srm 
    ON sp1.principal_id = srm.member_principal_id 
    JOIN sys.server_principals sp2 
    ON srm.role_principal_id = sp2.principal_id 
) 
select distinct 
    USERNAME, 
    [DESC], 
    STUFF(
     (
     SELECT 
      ',' + ROLES 
     FROM cte 
     WHERE cte.USERNAME = t.USERNAME 
     FOR XML PATH(''),TYPE 
     ).value('.','VARCHAR(MAX)' 
     ), 1, 1, '' 
    ) As ROLES 
from cte t 

enter image description here

+0

把它帶到下一步的好工作。 – Morpheus

相關問題