SUSER NAME: примеры (SQL)

Функция SUSER_NAME для работы с именами входа в SQL Server
Раздел: Функции управления системой
SUSER_NAME([ server_user_id ]): nchar(128)

Функция SUSER_NAME в MS SQL Server

Функция SUSER_NAME в Microsoft SQL Server возвращает имя входа пользователя, связанное с идентификатором безопасности (SID) на уровне экземпляра сервера. Она применяется для аудита, ведения журналов, контроля доступа или отображения информации о текущем или указанном пользователе сервера.

Синтаксис функции: SUSER_NAME ( [ server_user_id ] )

Аргументы:

  • server_user_id (необязательный, тип данных int): Идентификатор пользователя сервера (server user ID), для которого нужно получить имя входа. Если аргумент не указан, функция возвращает имя текущего пользователя.

Возвращаемое значение: nvarchar(128). Функция возвращает имя входа пользователя сервера. Если указанный server_user_id не существует, возвращается NULL. При вызове без аргумента возвращается имя текущего контекста безопасности.

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

Использование без аргументов для получения текущего пользователя:

SELECT SUSER_NAME() AS CurrentServerLogin;
CurrentServerLogin
--------------------
DOMAIN\IvanovII

Использование с числовым идентификатором:

-- Предполагая, что идентификатор 1 соответствует sa
SELECT SUSER_NAME(1) AS LoginForID;
LoginForID
----------
sa

Запрос с несуществующим идентификатором:

SELECT SUSER_NAME(999999) AS NonExistentLogin;
NonExistentLogin
----------------
NULL

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

В MS SQL существуют другие функции для получения информации о пользователе:

  • SYSTEM_USER: Возвращает имя текущего контекста входа. Функция не принимает параметров и аналогична SUSER_NAME() без аргументов.
  • SUSER_SNAME ( [ server_user_sid ] ): Возвращает имя входа по его идентификатору безопасности (SID), а не по числовому ID. Принимает varbinary(85). Более надежна для связей между базами данных, так как SID уникален в пределах домена.
  • USER_NAME ( [ database_user_id ] ): Возвращает имя пользователя базы данных, а не имя входа на сервер. Работает на уровне конкретной базы данных.

SUSER_NAME предпочтительнее использовать, когда известен числовой server_user_id из системных представлений (например, sys.server_principals). SYSTEM_USER удобна для быстрого получения текущего имени. SUSER_SNAME используется при работе с SID, например, после функции SUSER_SID().

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

MySQL: Функция USER(), CURRENT_USER() или SESSION_USER() возвращает имя текущего пользователя и хост. Параметры не принимает.

SELECT USER();
'ivanovii@localhost'

Oracle: Функция USER (псевдостолбец) возвращает имя текущего пользователя сессии. Параметров нет.

SELECT USER FROM DUAL;
IVANOVII

PostgreSQL: Функция CURRENT_USER или SESSION_USER возвращает имя текущего пользователя. Параметры не принимает.

SELECT CURRENT_USER;
ivanovii

SQLite: Прямого аналога нет. Концепция встроенной аутентификации пользователей сервера отсутствует.

Sybase ASE: Функция SUSER_NAME() существует и работает аналогично MS SQL, что связано с общим историческим происхождением.

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

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

SELECT SUSER_NAME('abc');
Msg 8114, Level 16, State 5, Line 1
Error converting data type varchar to int.

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

-- Неправильное понимание контекста
SELECT SUSER_NAME() AS DBUser; -- Возвращает 'DOMAIN\IvanovII'
SELECT USER_NAME() AS DBUser;  -- Может возвращать 'dbo' или другое

Использование в контексте, где нет пользователя (например, внутри триггера, активируемого системным процессом), может вернуть NULL или системное имя.

Изменения в последних версиях

В SQL Server 2014 и более новых версиях (совместимость с уровнем 120 и выше) не было внесено значительных изменений в поведение или синтаксис SUSER_NAME. Основное изменение, которое остается актуальным с ранних версий: если указан несуществующий server_user_id, функция возвращает NULL, а не вызывает ошибку. В очень старых версиях (до SQL Server 2000) поведение могло отличаться.

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

Получение списка всех имен входа и их числовых ID из системного каталога:

Пример sql
SELECT principal_id, name, SUSER_NAME(principal_id) AS LoginName
FROM sys.server_principals
WHERE type IN ('S', 'U', 'G') -- SQL, Windows пользователи, группы
ORDER BY principal_id;
principal_id name          LoginName
------------ ------------- -------------
1           sa            sa
2           public        NULL
3           ##MS_SQL...   NULL
...         ...           ...
256         DOMAIN\Group  DOMAIN\Group

Использование в предложении WHERE для фильтрации по текущему пользователю:

Пример sql
-- Аудит: выборка записей, созданных текущим пользователем сервера
SELECT * FROM dbo.AuditLog 
WHERE CreatedByServerLogin = SUSER_NAME();

Комбинирование с SUSER_SID для получения SID текущего пользователя, а затем обратного преобразования:

Пример sql
DECLARE @UserSID VARBINARY(85) = SUSER_SID();
SELECT SUSER_NAME() AS NameByDefault,
       SUSER_SNAME(@UserSID) AS NameBySID,
       SUSER_NAME(1) AS saLogin;
NameByDefault    NameBySID         saLogin
---------------  ---------------   -------
DOMAIN\IvanovII  DOMAIN\IvanovII  sa

Использование в вычисляемом столбце для автоматического протоколирования имени входа, создавшего запись:

Пример sql
CREATE TABLE dbo.Orders (
    OrderID INT PRIMARY KEY,
    OrderData NVARCHAR(100),
    ServerLoginCreated AS SUSER_NAME() PERSISTED
);
INSERT INTO dbo.Orders (OrderID, OrderData) VALUES (1, 'Test');
SELECT * FROM dbo.Orders;
OrderID OrderData ServerLoginCreated
------- --------- -------------------
1       Test      DOMAIN\IvanovII

Проверка наличия конкретного имени входа на сервере по его ID:

Пример sql
SELECT 
    CASE 
        WHEN SUSER_NAME(100) IS NULL THEN 'Login with ID 100 does not exist.'
        ELSE 'Login exists: ' + SUSER_NAME(100)
    END AS CheckResult;

MS SQL SUSER_NAME function comments

En
SUSER NAME Returns the login name from a login identification number