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

Работа с функцией IS_MEMBER для проверки доступа в SQL Server
Раздел: Функции безопасности и шифрования, Безопасность
IS_MEMBER('group' | 'role'): int

Описание функции IS_MEMBER в MS SQL Server

Функция IS_MEMBER в MS SQL Server определяет, является ли текущий пользователь участником указанной группы Windows или роли SQL Server. Ее применение актуально для управления доступом и проверки разрешений непосредственно в запросах или хранимых процедурах.

Синтаксис функции: IS_MEMBER ( { 'group' | 'role' } ).

Функция принимает один аргумент — строку с именем группы Windows или роли SQL Server. Аргумент может быть передан в формате 'домен\группа' для групп Windows или просто 'роль' для ролей сервера или базы данных.

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

  • 1: текущий пользователь является участником указанной группы или роли.
  • 0: текущий пользователь не является участником указанной группы или роли.
  • NULL: указанная группа или роль не существует, или у вызывающего нет разрешения на просмотр членства.

Короткие примеры использования IS_MEMBER

Пример проверки членства в роли базы данных:

SELECT IS_MEMBER('db_owner');
---
1

Пример проверки членства в группе Windows:

SELECT IS_MEMBER('DOMAIN\Analysts');
---
0

Пример, когда группа не существует:

SELECT IS_MEMBER('NonExistentRole');
---
NULL

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

Функция IS_ROLEMEMBER выполняет схожую задачу, но предназначена конкретно для проверки членства в ролях базы данных. Ее использование предпочтительнее при работе только с ролями, так как она явно указывает на этот контекст.

Функция HAS_PERMS_BY_NAME позволяет проверить наличие конкретного разрешения у пользователя. Она дает более детальный контроль по сравнению с IS_MEMBER, которая проверяет только членство.

Функция IS_SRVROLEMEMBER используется для проверки членства в фиксированных серверных ролях, таких как 'sysadmin' или 'securityadmin'. Ее применение актуально для проверки прав на уровне всего экземпляра SQL Server.

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

В PostgreSQL для проверки членства в роли применяется запрос к системному каталогу pg_roles или использование функции pg_has_role().

SELECT pg_has_role('myrole', 'MEMBER');
---
t

В Oracle информацию о ролях пользователя можно получить из представлений DBA_ROLE_PRIVS или SESSION_ROLES.

SELECT COUNT(*) FROM session_roles WHERE role = 'MYROLE';
---
1

В MySQL подобная функциональность отсутствует на уровне встроенных функций. Проверка привилегий осуществляется через запросы к таблицам INFORMATION_SCHEMA.USER_PRIVILEGES.

Типичные ошибки при использовании IS_MEMBER

Ошибка из-за неправильного формата имени группы Windows. Имя домена должно быть разделено обратным слешем.

-- Неправильно
SELECT IS_MEMBER('DOMAIN/Analysts');
-- Правильно
SELECT IS_MEMBER('DOMAIN\Analysts');
---
NULL
---
0 или 1

Ожидание числового результата без учета NULL. Если группа не существует, функция вернет NULL, что может привести к неожиданным результатам в арифметических операциях.

DECLARE @AccessLevel INT = 100 * IS_MEMBER('SomeGroup');
SELECT @AccessLevel;
---
NULL

Изменения в функции IS_MEMBER

В последних версиях MS SQL Server не было значительных изменений в работе или синтаксисе функции IS_MEMBER. Ее поведение остается стабильным на протяжении многих версий, начиная с SQL Server 2005.

Основные отличия связаны с поддержкой новых типов ролей или интеграцией с облачными сервисами Azure Active Directory, но сама функция принимает те же аргументы и возвращает аналогичные значения.

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

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

Пример sql
CREATE PROCEDURE dbo.ReportData
AS
BEGIN
IF IS_MEMBER('db_owner') = 1
SELECT * FROM dbo.SensitiveData;
ELSE
SELECT * FROM dbo.PublicData;
END;
---
Команда выполнена успешно.

Динамическое определение уровня доступа в столбце представления.

Пример sql
CREATE VIEW dbo.vw_Data AS
SELECT
ID,
Data,
CASE IS_MEMBER('Auditors')
WHEN 1 THEN 'Full Access'
WHEN 0 THEN 'Limited Access'
ELSE 'Access Undefined'
END AS AccessLevel
FROM dbo.SomeTable;

Комбинирование проверок членства в нескольких ролях.

Пример sql
SELECT
CASE
WHEN IS_MEMBER('db_owner') = 1 THEN 'Owner'
WHEN IS_MEMBER('db_datareader') = 1 THEN 'Reader'
ELSE 'Other'
END AS UserRole;
---
Owner

Использование в предложении WHERE для фильтрации данных на основе роли.

Пример sql
SELECT * FROM dbo.Orders
WHERE
IS_MEMBER('SalesManager') = 1
OR CustomerRegion = 'Public';

MS SQL IS_MEMBER function comments

En
IS MEMBER Indicates whether the current user is a member of the specified Windows group or SQL Server role