MSSQLSERVER_17892
Область применения: SQL Server
Сведения
Атрибут | Значение |
---|---|
Название продукта | SQL Server |
ИД события | 17892 |
Источник событий | MSSQLSERVER |
Компонент | SQLEngine |
Символическое имя | SRV_LOGON_FAILED_BY_TRIGGER |
Текст сообщения | Сбой входа в систему для имени> входа <из-за выполнения триггера. |
Описание
Ошибка 17892 возникает, когда код триггера входа невозможно выполнить успешно. Триггеры входа вызывают срабатывание хранимых процедур в ответ на событие LOGON. Это событие возникает при установке сеанса пользователя с экземпляром SQL Server. Пользователю выводится сообщение об ошибке наподобие следующего:
Msg 17892, уровень 14, состояние 1, имя> сервера<, строка 1
Сбой входа в систему для имени> входа <из-за выполнения триггера.
Возможные причины
Проблема может возникнуть, если при выполнении кода триггера для данной учетной записи пользователя имеется ошибка. Вот некоторые возможные сценарии:
- Триггер пытается вставить данные в таблицу, которая не существует.
- У имени входа нет разрешений на доступ к объекту, на который ссылается триггер входа.
Действие пользователя
В зависимости от сценария можно использовать одно из описанных ниже решений.
Сценарий 1. В настоящее время у вас есть доступ к открытому сеансу к SQL Server под учетной записью администратора.
В этом случае можно предпринять корректирующее действие, необходимое для исправления кода триггера.
Пример 1. Если объект, на который ссылается код триггера, не существует, создайте этот объект, чтобы триггер входа был успешно выполнен.
Пример 2. Если объект, на который ссылается код триггера, существует, но у пользователей нет разрешений, предоставьте им необходимые привилегии для доступа к объекту.
Кроме того, можно просто удалить или отключить триггер входа, чтобы пользователи могли продолжать вход в SQL Server.
Сценарий 2. У вас нет текущего сеанса, открытого в рамках привилегий администратора, но в SQL Server включено подключение к выделенному администратору (DAC).
В этом случае можно использовать соединение DAC, чтобы выполнить те же действия, что и в случае 1, так как триггеры входа не влияют на соединения DAC. Дополнительные сведения о подключении DAC см. в статье " Диагностическое подключение для администраторов баз данных".
Чтобы проверить, включен ли DAC в SQL Server, можно проверить журнал ошибок SQL Server для сообщения, аналогичного следующему:
09.02.2020 16:17:44.150 Сервер. Установлена поддержка выделенных соединений с административными полномочиями для локального прослушивания по порту 1434.
Сценарий 3. У вас на сервере нет поддержки DAC или существующего сеанса администратора в SQL Server.
В такой ситуации единственным способом устранения проблемы является выполнение указанных ниже действий.
Остановите SQL Server и связанные службы.
Запустите SQL Server из командной строки с помощью параметров
-c
запуска и-m
-f
. Это приведет к отключению триггера входа и позволит выполнить те же действия по устранению проблемы, что и в случае 1 выше.Примечание.
Для описанной выше процедуры требуется SA или эквивалентная учетная запись администратора.
Дополнительные сведения об этих и других вариантах запуска см. в статье ядро СУБД Параметры запуска службы.
Дополнительные сведения
Другой ситуацией, в которой происходит сбой триггеров входа, является использование функции EVENTDATA
. Эта функция возвращает код XML и учитывает регистр. Поэтому если вы создаете следующий триггер входа, намереваясь блокировать доступ по IP-адресу, может возникнуть проблема:
CREATE TRIGGER tr_logon_CheckIP
ON ALL SERVER
FOR LOGON
AS
BEGIN
IF IS_SRVROLEMEMBER ( 'sysadmin' ) = 1
BEGIN
DECLARE @IP NVARCHAR ( 15 );
SET @IP = ( SELECT EVENTDATA ().value ( '(/EVENT_INSTANCE/ClientHost)[1]' , 'NVARCHAR(15)' ));
IF NOT EXISTS( SELECT IP FROM DBAWork.dbo.ValidIP WHERE IP = @IP )
ROLLBACK ;
END ;
END ;
GO
При копировании скрипта из Интернета пользователь не сохранил регистр в этой части триггера:
SELECT EVENTDATA().value ( '(/event_instance/clienthost)[1]' , 'NVARCHAR(15)');
В результате функция EVENTDATA
всегда возвращала значение NULL, и всем именам входа, эквивалентным SA, было отказано в доступе. В этом случае соединение DAC не включено, поэтому единственный возможный вариант — перезапустить сервер с приведенными выше параметрами запуска, чтобы удалить триггер.