sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo consultar los roles del usuario actual

No debe usar vistas de compatibilidad con versiones anteriores obsoletas ( busque en esta página sysusers , por ejemplo ). En su lugar, debería usar sys.database_principals y sys.database_role_members . Tenga en cuenta que a la conexión actual se le puede haber otorgado acceso fuera del alcance de la base de datos (por ejemplo, estos devolverán resultados vacíos si el usuario resulta ser un sysadmin en cuyo caso no es necesario que se les conceda explícitamente una pertenencia a un rol o permisos específicos). También para los permisos asignados explícitamente fuera del alcance de un rol, que anularán los proporcionados por el rol, también debe marcar sys.database_permissions . Aquí hay un ejemplo independiente que puede consultar (siempre y cuando no tenga un inicio de sesión llamado blatfarA o una base de datos llamada 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

Para probarlo:

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;

Resultados:

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

Limpiar:

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