現在の接続のすべてのデータベース・ロールのリストを検索するselectステートメントを探しています。現在のユーザーの役割を照会する方法
私は(ETCなどの表示/非表示]メニュー項目)ソフトウェアは、役割に応じてユーザーインターフェイスを調整することができるように、クライアント・ソフトウェアへのすべてのロールを返しますビューを作成したい
現在の接続のすべてのデータベース・ロールのリストを検索するselectステートメントを探しています。現在のユーザーの役割を照会する方法
私は(ETCなどの表示/非表示]メニュー項目)ソフトウェアは、役割に応じてユーザーインターフェイスを調整することができるように、クライアント・ソフトウェアへのすべてのロールを返しますビューを作成したい
廃止予定の後方互換性ビュー(search this page for sysusers
, for example)を使用しないでください。代わりにsys.database_principals
とsys.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
することができますここです開始:
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
なぜあなたは廃止使用している互換性ビューSQL Serverのバージョン? ([このページ(http://technet.microsoft.com/en-us/library/bb510662(v = sql.100).aspx)で 'sysusers'を検索してください。) –
また、 "現在の接続に割り当てられているすべてのデータベースの役割を知りたい"これはすべてを返します。 –
こんにちは、ありがとう、これははるかに良いです。一方、私は最初の試みが必ずしも正しい結果を出すとは限らないことを発見しました。私は受け入れられた答えを変更しました。 –
おそらく '@ login'クエリで悩むのではなく、' CURRENT_USER'を使うようにデモのコードを単純化することができます。古い習慣は激しく死ぬ。 –
「古い習慣が酷い」 - あなたは非常に正しいです! –