IS SRVROLEMEMBER: примеры (SQL)

Проверка ролей сервера: функция IS_SRVROLEMEMBER
Раздел: Функции безопасности и шифрования, Безопасность
IS_SRVROLEMEMBER('role' [, 'login']): int

Описание функции IS_SRVROLEMEMBER

Функция IS_SRVROLEMEMBER в Microsoft SQL Server предназначена для проверки членства учетной записи сервера в фиксированной роли сервера. Она используется для контроля доступа, принятия решений в скриптах T-SQL и аудита прав пользователей.

Аргументы функции:

  • role (sysname): Имя фиксированной роли сервера. Может быть строковым значением ('sysadmin', 'serveradmin', 'securityadmin', 'processadmin', 'setupadmin', 'bulkadmin', 'diskadmin', 'dbcreator', 'public') или идентификатором роли (SID).
  • login (sysname, необязательный): Имя логина сервера для проверки. Если аргумент не указан, функция проверяет членство текущего пользователя.

Возвращаемые значения:

  • 1: Указанный логин является членом указанной роли.
  • 0: Логин не является членом роли или логин не имеет права CONNECT SQL на сервере.
  • NULL: Имя роли или логина недопустимо или отсутствует. Функция также возвращает NULL, если у пользователя нет разрешения на просмотр членства в роли.

Примеры использования

Проверка текущего пользователя на роль sysadmin.

SELECT IS_SRVROLEMEMBER('sysadmin');
1

Проверка конкретного логина на роль serveradmin.

SELECT IS_SRVROLEMEMBER('serveradmin', 'MyLogin');
0

Проверка роли с помощью идентификатора.

DECLARE @role_sid VARBINARY(85);
SELECT @role_sid = sid FROM sys.server_principals WHERE name = 'setupadmin';
SELECT IS_SRVROLEMEMBER(@role_sid, 'sa');
1

Некорректное имя роли.

SELECT IS_SRVROLEMEMBER('nonexistent_role');
NULL

Похожие функции в MS SQL

IS_MEMBER: Проверяет членство текущего пользователя в роли базы данных или группе Windows. Применяется для проверки прав внутри конкретной базы данных, а не на уровне сервера.

HAS_PERMS_BY_NAME: Оценивает эффективные разрешения пользователя на конкретный защищаемый объект. Предоставляет более детальную информацию о правах, чем проверка роли.

SERVERPROPERTY('IsIntegratedSecurityOnly') и другие системные функции: Позволяют получить информацию о конфигурации сервера, что может быть полезно в комбинации с проверкой ролей.

Выбор функции зависит от контекста: IS_SRVROLEMEMBER используют для администрирования сервера, IS_MEMBER для контроля внутри базы, а HAS_PERMS_BY_NAME для точной проверки конкретных разрешений.

Аналоги в других СУБД

MySQL: Нет прямой аналогии. Информацию о привилегиях получают через запросы к таблицам INFORMATION_SCHEMA.USER_PRIVILEGES или используют встроенные функции как CURRENT_ROLE().

-- Проверка роли в MySQL 8.0+
SELECT CURRENT_ROLE();
-- Или проверка привилегий
SELECT * FROM information_schema.user_privileges WHERE grantee LIKE '%user_name%';

Oracle: Для проверки системных привилегий или ролей используют представления DBA_ROLE_PRIVS или SESSION_ROLES.

-- Проверка ролей текущей сессии в Oracle
SELECT * FROM SESSION_ROLES WHERE ROLE = 'DBA';

PostgreSQL: Используют функцию pg_has_role() для проверки членства пользователя в роли.

-- Проверка в PostgreSQL
SELECT pg_has_role('postgres', 'pg_read_all_settings', 'MEMBER');

SQLite: Концепция ролей сервера отсутствует. Управление доступом ограничено привилегиями файловой системы.

Типичные ошибки

Передача имени роли без кавычек, если оно является строковым литералом.

-- Ошибка: воспринимается как столбец
SELECT IS_SRVROLEMEMBER(sysadmin);
Msg 207, Level 16, State 1: Invalid column name 'sysadmin'.

Проверка членства для несуществующего логина возвращает 0, а не NULL, если логин отсутствует, но есть право CONNECT SQL.

SELECT IS_SRVROLEMEMBER('sysadmin', 'NonExistentLogin');
0

Использование для ролей уровня базы данных.

-- Эта функция не работает с ролями БД, такими как db_owner
SELECT IS_SRVROLEMEMBER('db_owner');
NULL

Отсутствие у вызывающего пользователя разрешения VIEW ANY DEFINITION может привести к возврату NULL, даже если проверяемый логин является членом роли.

Изменения в версиях

Основное поведение функции остается стабильным. В SQL Server 2012 и более поздних версиях в список допустимых имен ролей была явно включена роль public. Все пользователи, имеющие доступ к серверу, являются членами этой роли, поэтому проверка IS_SRVROLEMEMBER('public') всегда возвращает 1 для текущего пользователя.

Функция адаптирована для работы с учетными записями Azure Active Directory в облачных версиях SQL Server.

Расширенные примеры

Использование в условной логике хранимой процедуры для ограничения выполнения.

CREATE PROCEDURE dbo.RestrictedProcedure
AS
BEGIN
    IF IS_SRVROLEMEMBER('sysadmin') = 1
        PRINT 'Выполнение разрешено.';
    ELSE
        RAISERROR('Доступ запрещен. Требуются права sysadmin.', 16, 1);
END;

Динамическое определение возможных действий для пользователя.

DECLARE @CanManageServer INT = IS_SRVROLEMEMBER('serveradmin');
DECLARE @CanCreateDB INT = IS_SRVROLEMEMBER('dbcreator');
SELECT
    @CanManageServer AS CanManageServer,
    @CanCreateDB AS CanCreateDB;
CanManageServer CanCreateDB
--------------- ------------
1              0

Аудит членства в ролях для всех логинов.

SELECT
    sp.name AS LoginName,
    IS_SRVROLEMEMBER('sysadmin', sp.name) AS IsSysAdmin,
    IS_SRVROLEMEMBER('securityadmin', sp.name) AS IsSecurityAdmin
FROM sys.server_principals sp
WHERE sp.type IN ('S', 'U', 'G') -- SQL, Windows, Group
    AND sp.name NOT LIKE 'NT %';

Комбинация с другими системными функциями для комплексной проверки безопасности.

SELECT
    SUSER_NAME() AS CurrentLogin,
    IS_SRVROLEMEMBER('sysadmin') AS IsSysAdmin,
    IS_MEMBER('db_owner') AS IsDbOwnerInCurrentDB;

MS SQL IS_SRVROLEMEMBER function comments

En
IS SRVROLEMEMBER Indicates whether the current login is a member of the specified server role