2013-08-12 43 views
9

Tôi đang tìm một câu lệnh chọn sẽ truy xuất danh sách tất cả vai trò cơ sở dữ liệu cho kết nối hiện tại của tôi.Cách truy vấn vai trò của người dùng hiện tại

Tôi muốn tạo ra một cái nhìn mà sẽ trả lại tất cả vai trò một phần mềm máy khách, như vậy mà phần mềm có thể điều chỉnh giao diện người dùng của nó theo vai trò (ví dụ như show/hide mục trình đơn vv)

Trả lời

17

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_principalssys.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 
+0

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. –

+1

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. –

+0

"thói quen cũ chết cứng" - bạn rất đúng !! –

5

đây là nơi bạn có thể bắt đầu:

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

xem khả năng tương thích Tại sao bạn đang sử dụng bị phản đối sẽ được loại bỏ trong một tương lai phiên bản của SQL Server? (Tìm kiếm [trang này] (http://technet.microsoft.com/en-us/library/bb510662 (v = sql.100) .aspx) cho 'sysusers'.) –

+0

Ngoài ra, tôi không thấy cách này câu trả lời "Tôi muốn biết tất cả các vòng quay DATABASE đã được gán cho kết nối hiện tại của tôi." Điều này trả về mọi thứ. –

Các vấn đề liên quan