web-dev-qa-db-ja.com

現在のユーザーの役割を照会する方法

現在の接続のすべてのデータベースロールのリストを取得するselectステートメントを探しています。

すべての役割をクライアントソフトウェアに返すビューを作成して、ソフトウェアが役割に応じてユーザーインターフェイスを調整できるようにします(たとえば、メニューエントリの表示/非表示など)

12
SQL Police

非推奨の後方互換ビューを使用しないでください( たとえば、このページでsysusersを検索してください )。代わりに、 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

テストするには:

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;

結果:

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

掃除:

USE master;
GO
ALTER DATABASE floob SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
DROP DATABASE floob;
GO
DROP LOGIN blatfarA;
GO
21
Aaron Bertrand