HOST ID: примеры (SQL)

Работа с идентификатором хоста в Microsoft SQL Server
Раздел: Сетевые функции, Системные
HOST_ID: char(10)

Функция HOST_ID() в Microsoft SQL Server возвращает идентификатор рабочей станции, с которой установлено текущее соединение с сервером баз данных. Этот идентификатор представляет собой целое число.

Общая информация

Функция используется для аудита и отслеживания активности пользователей, а также для логирования соединений в распределенных системах. Она позволяет связать действия в базе данных с конкретным клиентским компьютером.

Синтаксис: HOST_ID()

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

Идентификатор хоста обычно стабилен в течение одного сеанса соединения, но может меняться при переподключении. Его значение часто соответствует числовому представлению NetBIOS-имени компьютера.

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

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

SELECT HOST_ID() AS HostID;
HostID
-------
2680

Использование в составе более сложного запроса для логирования.

SELECT 
    SUSER_NAME() AS LoginName,
    HOST_ID() AS HostID,
    GETDATE() AS LoginTime
FROM sys.dm_exec_sessions 
WHERE session_id = @@SPID;
LoginName      HostID  LoginTime
----------     ------  -----------------------
MyDomain\User1 2680    2023-10-05 14:30:25.123

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

  • HOST_NAME() - возвращает имя рабочей станции в виде строки. Полезнее для читаемого логирования, но может быть менее уникальным, чем числовой идентификатор.
  • @@SPID - возвращает идентификатор серверного процесса для текущего сеанса. Позволяет идентифицировать соединение на стороне сервера.
  • SESSION_USER и CURRENT_USER - возвращают контекст пользователя в базе данных, а не информацию о соединении.
  • ORIGINAL_LOGIN() - возвращает имя входа, которое изначально установило соединение, что полезно в контексте олицетворения.

Функцию HOST_ID() предпочтительнее использовать, когда требуется числовой идентификатор для индексирования или сравнения. HOST_NAME() больше подходит для отчетов, предназначенных для чтения человеком.

Аналоги в других системах

MySQL: Отсутствует прямая аналогичная функция. Для получения информации о соединении иногда используют CONNECTION_ID(), который возвращает идентификатор потока для соединения.

SELECT CONNECTION_ID();
12345

Oracle: Пакет SYS_CONTEXT('USERENV', 'HOST') возвращает имя хоста.

SELECT SYS_CONTEXT('USERENV', 'HOST') FROM DUAL;
myclient.example.com

PostgreSQL: Функция inet_client_addr() возвращает IP-адрес клиентского соединения. Для имени хоста используется inet_client_port() или дополнительное разрешение.

SELECT inet_client_addr();
192.168.1.100

SQLite: Не имеет встроенных функций для определения хоста, так как является встраиваемой СУБД.

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

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

-- Неверное предположение об уникальности
CREATE TABLE Log (ID int, HostID int UNIQUE); -- Может вызвать ошибку дублирования
INSERT INTO Log VALUES (1, HOST_ID());

Попытка использовать результат функции как строку без преобразования, когда ожидается целое число.

-- Ошибки не будет, но это пример неявного преобразования
SELECT 'Host ID is: ' + CAST(HOST_ID() AS VARCHAR(10)); -- Явное преобразование безопаснее

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

Функция HOST_ID() не претерпела значительных изменений в последних версиях MS SQL Server (2016, 2017, 2019, 2022). Ее поведение остается обратно совместимым. Однако, в средах с высокой безопасностью или в облачных развертываниях Azure SQL значение может быть маскировано или возвращать фиксированное значение для защиты конфиденциальности.

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

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

Пример sql
CREATE TABLE dbo.AuditLog (
    LogID INT IDENTITY PRIMARY KEY,
    TableName NVARCHAR(128),
    ActionType CHAR(1),
    ChangedBy NVARCHAR(128),
    HostID INT,
    ChangeTime DATETIME DEFAULT GETDATE()
);

CREATE TRIGGER trg_Employee_Audit
ON dbo.Employees
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
    INSERT INTO dbo.AuditLog (TableName, ActionType, ChangedBy, HostID)
    VALUES ('Employees', 
            CASE WHEN EXISTS(SELECT * FROM inserted) AND EXISTS(SELECT * FROM deleted) THEN 'U'
                 WHEN EXISTS(SELECT * FROM inserted) THEN 'I'
                 ELSE 'D' END,
            ORIGINAL_LOGIN(),
            HOST_ID());
END;

Определение количества уникальных хостов, подключенных к серверу в данный момент.

Пример sql
SELECT COUNT(DISTINCT host_id) AS UniqueHosts
FROM sys.dm_exec_connections
WHERE host_id > 0;
UniqueHosts
-----------
15

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

Пример sql
DECLARE @CurrentHostID INT = HOST_ID();
IF @CurrentHostID = 2680 -- ID конкретного сервера приложений
    PRINT 'Выполняется специальная настройка для этого хоста.';
ELSE
    PRINT 'Стандартная обработка.';

Связывание сеансов по идентификатору хоста в мониторинге активности.

Пример sql
SELECT 
    c.session_id,
    s.login_name,
    c.host_id,
    s.program_name
FROM sys.dm_exec_connections c
JOIN sys.dm_exec_sessions s ON c.session_id = s.session_id
WHERE c.host_id = HOST_ID();

MS SQL HOST_ID function comments

En
HOST ID Returns the workstation identification number