Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách truy vấn vai trò của người dùng hiện tại

Bạn không nên sử dụng các chế độ xem tương thích ngược không dùng nữa ( tìm kiếm trang này cho sysusers , ví dụ ). Thay vào đó, bạn nên sử dụng sys.database_principals sys.database_role_members . Hãy nhớ 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ơ sở dữ liệu (ví dụ:những kết nối này sẽ trả về kết quả trống nếu người dùng tình cờ là sysadmin trong trường hợp đó, họ không cần phải được cấp vai trò thành viên rõ ràng hoặc các quyền cụ thể). 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 một vai trò, quyền này sẽ ghi đè những quyền được cung cấp bởi vai trò, bạn 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 có tên blatfarA hoặc cơ sở dữ liệu có tên 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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lọc câu lệnh SELECT theo thời gian trong ngày

  2. Máy chủ SQL bỏ qua trường hợp trong một biểu thức where

  3. Trả lại tất cả các khóa ngoại và Ràng buộc KIỂM TRA trong Cơ sở dữ liệu SQL Server (Ví dụ T-SQL)

  4. Cách cập nhật thống kê máy chủ SQL cho bảng lớn

  5. “Truy vấn không được phép trong Waitfor” Lỗi 101 trong SQL Server