IS SRVROLEMEMBER: примеры (SQL)
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;