Поделиться через


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.

    В такой ситуации единственным способом устранения проблемы является выполнение указанных ниже действий.

    1. Остановите SQL Server и связанные службы.

    2. Запустите 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 не включено, поэтому единственный возможный вариант — перезапустить сервер с приведенными выше параметрами запуска, чтобы удалить триггер.