Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Cara menanyakan peran pengguna saat ini

Anda tidak boleh menggunakan tampilan kompatibilitas mundur yang tidak digunakan lagi ( cari halaman ini untuk sysusers , misalnya ). Sebagai gantinya, Anda harus menggunakan sys.database_principals dan sys.database_role_members . Perlu diingat bahwa koneksi saat ini mungkin telah diberikan akses di luar cakupan database (misalnya ini akan mengembalikan hasil kosong jika pengguna adalah sysadmin dalam hal ini mereka tidak perlu secara eksplisit diberikan keanggotaan peran atau izin khusus). Juga untuk izin yang ditetapkan secara eksplisit di luar cakupan peran, yang akan menggantikan izin yang diberikan oleh peran, Anda juga harus memeriksa sys.database_permissions . Berikut adalah contoh mandiri yang dapat Anda lihat (asalkan Anda belum memiliki login bernama blatfarA atau database bernama 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

Untuk mengujinya:

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;

Hasil:

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

Membersihkan:

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. SQL Server ANSI_NULLS Dijelaskan

  2. Contoh Kueri Server Tertaut SQL Server

  3. SQL kolom tunggal dibagi menjadi beberapa kolom

  4. Nilai acak untuk kolom DATETIME

  5. SQL Server Internal:Operator Bermasalah Pt. II – Hashing