SUSER NAME: примеры (SQL)
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 из системного каталога:
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 для фильтрации по текущему пользователю:
-- Аудит: выборка записей, созданных текущим пользователем сервера
SELECT * FROM dbo.AuditLog
WHERE CreatedByServerLogin = SUSER_NAME();Комбинирование с SUSER_SID для получения SID текущего пользователя, а затем обратного преобразования:
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
Использование в вычисляемом столбце для автоматического протоколирования имени входа, создавшего запись:
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:
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;