Bạn không nên sử dụng chế độ xem tương thích ngược không được dùng nữa (search this page for sysusers
, for example). Thay vào đó, bạn nên sử dụng sys.database_principals
và sys.database_role_members
. Lưu ý rằng kết nối hiện tại có thể đã được cấp quyền truy cập bên ngoài phạm vi của cơ sở dữ liệu (ví dụ: các kết quả này sẽ trả lại kết quả trống nếu người dùng xảy ra là sysadmin
trong trường hợp đó họ không cần phải được cấp rõ ràng vai trò thành viên hoặc cụ thể quyền). Ngoài ra đối với các quyền được chỉ định rõ ràng bên ngoài phạm vi của vai trò, sẽ ghi đè các vai trò được cung cấp bởi vai trò, bạn cũng nên kiểm tra thêm sys.database_permissions
. Đây là một ví dụ độc lập mà bạn có thể kiểm tra (miễn là bạn chưa có thông tin đăng nhập tên là blatfarA
hoặc một cơ sở dữ liệu có tên là 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
Để kiểm tra nó:
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;
Kết quả:
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
Dọn dẹp:
USE master;
GO
ALTER DATABASE floob SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
DROP DATABASE floob;
GO
DROP LOGIN blatfarA;
GO
Nguồn
2013-08-12 15:36:42
Xin cảm ơn, điều này tốt hơn nhiều. Trong khi đó, tôi thấy rằng nỗ lực đầu tiên của tôi không phải lúc nào cũng mang lại kết quả chính xác. Tôi đã thay đổi câu trả lời được chấp nhận. –
Bạn có thể đơn giản hóa mã trong bản trình diễn để sử dụng 'CURRENT_USER' thay vì làm phiền với truy vấn' @ login'. Thói quen cũ khó thay đổi. –
"thói quen cũ chết cứng" - bạn rất đúng !! –