非推奨の下位互換性ビュー (このページで 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
プレ>