2013-08-12 6 views
9

現在の接続のすべてのデータベース・ロールのリストを検索するselectステートメントを探しています。現在のユーザーの役割を照会する方法

私は(ETCなどの表示/非表示]メニュー項目)ソフトウェアは、役割に応じてユーザーインターフェイスを調整することができるように、クライアント・ソフトウェアへのすべてのロールを返しますビューを作成したい

答えて

17

廃止予定の後方互換性ビュー(search this page for sysusers, for example)を使用しないでください。代わりにsys.database_principalssys.database_role_membersを使用する必要があります。現在の接続にデータベースのスコープ外のアクセスが許可されている可能性があります(たとえば、ユーザーがsysadminの場合は空の結果が返されます。この場合、ロールメンバーシップまたは特定のアクセス許可)。また、ロールの範囲外に明示的に割り当てられた権限については、ロールによって提供される権限を上書きします。さらに、sys.database_permissionsをチェックする必要があります。ここにはチェックアウトできる自己完結型の例があります(ログイン名がblatfarAでないか、floobというデータベースがない場合)。

CREATE LOGIN blatfarA WITH PASSWORD = 'foo', CHECK_POLICY = OFF; 
GO 
CREATE DATABASE floob; 
GO 
USE floob; 
GO 
CREATE USER blatfarB FROM LOGIN [blatfarA] WITH DEFAULT_SCHEMA = dbo; 
GO 
GRANT SELECT, UPDATE ON SCHEMA::dbo TO blatfarB; 
DENY INSERT, EXECUTE ON SCHEMA::dbo TO blatfarB; 
GO 
EXEC sp_addrolemember N'db_datareader', N'blatfarB' 
GO 

それをテストするには:

name  name 
-------- ------------- 
blatfarB db_datareader 

class_desc major_id permission_name state_desc 
---------- -------- --------------- ---------- 
DATABASE 0   CONNECT   GRANT 
SCHEMA  1   INSERT   DENY 
SCHEMA  1   EXECUTE   DENY 
SCHEMA  1   SELECT   GRANT 
SCHEMA  1   UPDATE   GRANT 

クリーンアップ:

EXECUTE AS LOGIN = N'blatfarA'; 
GO 

DECLARE @login NVARCHAR(256), @user NVARCHAR(256); 

SELECT @login = login_name FROM sys.dm_exec_sessions WHERE session_id = @@SPID; 

SELECT @user = d.name 
    FROM sys.database_principals AS d 
    INNER JOIN sys.server_principals AS s 
    ON d.sid = s.sid 
    WHERE s.name = @login; 

SELECT u.name, r.name 
    FROM sys.database_role_members AS m 
    INNER JOIN sys.database_principals AS r 
    ON m.role_principal_id = r.principal_id 
    INNER JOIN sys.database_principals AS u 
    ON u.principal_id = m.member_principal_id 
    WHERE u.name = @user; 

SELECT class_desc, major_id, permission_name, state_desc 
    FROM sys.database_permissions 
    WHERE grantee_principal_id = USER_ID(@user); 

GO 
REVERT; 

結果、将来的に削除されます

USE master; 
GO 
ALTER DATABASE floob SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 
GO 
DROP DATABASE floob; 
GO 
DROP LOGIN blatfarA; 
GO 
+0

こんにちは、ありがとう、これははるかに良いです。一方、私は最初の試みが必ずしも正しい結果を出すとは限らないことを発見しました。私は受け入れられた答えを変更しました。 –

+1

おそらく '@ login'クエリで悩むのではなく、' CURRENT_USER'を使うようにデモのコードを単純化することができます。古い習慣は激しく死ぬ。 –

+0

「古い習慣が酷い」 - あなたは非常に正しいです! –

5

することができますここです開始:

select u.name, g.name 
from sysmembers as m 
    inner join sys.sysusers u on u.[uid] = m.memberuid 
    inner join sys.sysusers g on g.[uid] = m.groupuid 
+2

なぜあなたは廃止使用している互換性ビューSQL Serverのバージョン? ([このページ(http://technet.microsoft.com/en-us/library/bb510662(v = sql.100).aspx)で 'sysusers'を検索してください。) –

+0

また、 "現在の接続に割り当てられているすべてのデータベースの役割を知りたい"これはすべてを返します。 –

関連する問題