sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man frågar efter nuvarande användares roller

Du bör inte använda föråldrade bakåtkompatibilitetsvyer ( sök på den här sidan efter sysusers , till exempel ). Istället bör du använda sys .database_principals och sys.database_role_members . Tänk på att den aktuella anslutningen kan ha beviljats ​​åtkomst utanför databasens räckvidd (dessa kommer till exempel att returnera tomma resultat om användaren råkar vara en sysadmin i så fall behöver de inte uttryckligen ges rollmedlemskap eller specifika behörigheter). Även för behörigheter som tilldelas uttryckligen utanför omfattningen av en roll, som kommer att åsidosätta de som tillhandahålls av rollen, bör du dessutom kontrollera sys.database_permissions . Här är ett självständigt exempel som du kan kolla in (så länge du inte redan har en inloggning som heter blatfarA eller en databas som heter 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

För att testa 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;

Resultat:

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

Städa upp:

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



  1. Oracle apex välj lista och dölj värden

  2. dayname(curdate()) fungerar INTE i codeigniter php

  3. Passagerarfelbiblioteket har inte laddats

  4. MYSQL:Hur man ansluter till två tabeller på samma fråga som refererar till samma tabell två gånger