2017-02-06 1 views
0

のメンバーではない私は、次のようにストアドプロシージャを経由して特定のユーザーのデータベース・ロールを取得しています:戻りデータベースロールのユーザーが

USE SQLEXP_ALLEN 
GO 

SELECT 
    DP1.name AS RoleName, 
    ISNULL(DP2.name, 'No members') AS UserName 
FROM 
    sys.database_role_members AS DRM 
RIGHT OUTER JOIN 
    sys.database_principals AS DP1 ON DRM.role_principal_id = DP1.principal_id 
LEFT OUTER JOIN 
    sys.database_principals AS DP2 ON DRM.member_principal_id = DP2.principal_id 
WHERE 
    DP1.type = 'R' 
    AND DP2.name = @username 
ORDER BY 
    DP1.name; 

しかし、私が来るする方法を見つけ出すように見えることはできませんユーザーがメンバーではないロールを使用して起動します。助けて!

私はおそらく非常に多くのCTEを必要としませんが、それはロジックを説明し
+0

DP2.Nameの述語は、左結合を内部結合にしています。 –

答えて

0

: 1)SELCTすべての役割 2)すべてのユーザー 3を選択)クロスはすべての組み合わせを得るために参加。 4)外部メンバーをロールメンバーに委任し、メンバーがメンバーではないことを確認します。 あなたは必要なものを得るために各CTEを調整できます。

WITH Roles (RoleID, RoleName) 
     AS (SELECT rol.principal_id, 
        rol.name 
      FROM sys.database_principals rol 
      WHERE type = 'R' 
     ), 
    Users (UserID, Username) 
     AS (SELECT princ.principal_id , 
        princ.name 
      FROM  sys.database_principals princ 
      WHERE type IN ('U', 'G') 
     ), 
    UsersAllRoles (UserID, UserName, RoleID, RoleName) 
     AS (SELECT Users.UserID, Users.Username, Roles.RoleID, 
      Roles.RoleName 
      FROM  Users 
        CROSS JOIN Roles 
     ) 

SELECT uar.UserID , 
    uar.UserName , 
    uar.RoleID , 
    uar.RoleName , 
    drm.role_principal_id 
FROM UsersAllRoles uar 
    LEFT OUTER JOIN sys.database_role_members drm 
    ON uar.UserID =drm.member_principal_id 
    AND uar.RoleID = drm.role_principal_id 
WHERE drm.member_principal_id IS NULL; 
関連する問題