HOST ID: примеры (SQL)
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 значение может быть маскировано или возвращать фиксированное значение для защиты конфиденциальности.
Расширенные примеры использования
Использование в триггере для аудита изменений таблицы с записью хоста-источника.
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;
Определение количества уникальных хостов, подключенных к серверу в данный момент.
SELECT COUNT(DISTINCT host_id) AS UniqueHosts
FROM sys.dm_exec_connections
WHERE host_id > 0;
UniqueHosts ----------- 15
Использование в составе динамического SQL для условного выполнения команд в зависимости от хоста.
DECLARE @CurrentHostID INT = HOST_ID();
IF @CurrentHostID = 2680 -- ID конкретного сервера приложений
PRINT 'Выполняется специальная настройка для этого хоста.';
ELSE
PRINT 'Стандартная обработка.';
Связывание сеансов по идентификатору хоста в мониторинге активности.
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();