sql >> Database >  >> RDS >> Sqlserver

De rollen van de huidige gebruiker opvragen

U mag geen verouderde weergaven voor achterwaartse compatibiliteit gebruiken ( zoek op deze pagina naar sysusers , bijvoorbeeld ). In plaats daarvan zou u sys.database_principals en sys.database_role_members . Houd er rekening mee dat de huidige verbinding mogelijk toegang heeft gekregen buiten het bereik van de database (dit geeft bijvoorbeeld lege resultaten als de gebruiker een sysadmin is) in welk geval ze niet expliciet rollidmaatschap of specifieke machtigingen hoeven te krijgen). Ook voor machtigingen die expliciet buiten de reikwijdte van een rol zijn toegewezen, die de door de rol verstrekte machtigingen overschrijven, moet u bovendien sys.database_permissions . Hier is een op zichzelf staand voorbeeld dat u kunt uitchecken (zolang u nog geen login heeft met de naam blatfarA of een database genaamd 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

Om het te testen:

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;

Resultaten:

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

Opruimen:

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



  1. Primaire sleutels met Apache Spark

  2. Probleem met verbindingsreeks in webconfiguratiebestand

  3. Grails 2.4.4 DataSource create-drop kan niet alle tabellen met FK's laten vallen

  4. Een generieke kolom GEOGRAFIE hebben met PostGIS