Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak zapytać o role bieżącego użytkownika

Nie należy używać przestarzałych widoków zgodności wstecznej ( szukaj na tej stronie sysusers , na przykład ). Zamiast tego powinieneś używać sys.database_principals i sys.database_role_members . Pamiętaj, że bieżące połączenie mogło mieć przyznany dostęp poza zakresem bazy danych (np. zwrócą one puste wyniki, jeśli użytkownik jest sysadmin w takim przypadku nie trzeba im jawnie przyznać członkostwa w roli ani określonych uprawnień). Również w przypadku uprawnień przypisanych jawnie poza zakresem roli, które zastąpią te dostarczone przez rolę, należy dodatkowo sprawdzić sys.database_permissions . Oto samodzielny przykład, który możesz sprawdzić (o ile nie masz jeszcze loginu o nazwie blatfarA lub bazę danych o nazwie 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

Aby to przetestować:

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;

Wyniki:

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

Posprzątaj:

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. Miesiące między dwiema datami

  2. Jak uzyskać wartości parametrów dla zapytania SQL Server w programie SQL Server Profiler?

  3. LIKE i NULL w klauzuli WHERE w SQL

  4. transponuj wiersze do kolumn w sql

  5. Usuń bazę danych, ale nie usuwaj *.mdf / *.ldf