sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan forespørges den aktuelle brugers roller

Du bør ikke bruge forældede bagudkompatibilitetsvisninger ( søg på denne side efter sysusers , for eksempel ). I stedet bør du bruge sys.database_principals og sys.database_role_members . Husk, at den aktuelle forbindelse kan have fået adgang uden for databasens omfang (disse vil f.eks. returnere tomme resultater, hvis brugeren tilfældigvis er en sysadmin i så fald behøver de ikke eksplicit tildeles rollemedlemskab eller specifikke tilladelser). Også for tilladelser, der er tildelt eksplicit uden for rammerne af en rolle, og som vil tilsidesætte dem, der leveres af rollen, bør du desuden tjekke sys.database_permissions . Her er et selvstændigt eksempel, du kan tjekke ud (så længe du ikke allerede har et login ved navn blatfarA eller en database kaldet 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
 

For at teste det:

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;
 

Resultater:

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

Ryd op:

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



  1. Enhjørninger spiser MySQL-forbindelser uden at respektere poolstørrelsen - Rails

  2. Hvad er en god måde at trimme alle blanktegn fra en streng i T-SQL uden UDF og uden CLR?

  3. SequelizeConnectionRefusedError:tilslut ECONNREFUSED 127.0.0.1:3306

  4. Hvad er den bedste måde at forbinde iPhone-app (iOS SDK) til php/MySql-backend