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


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.

Управление триггерами входа

Перечислите все триггеры входа на сервере:

SELECT name, is_disabled, create_date, modify_date
FROM sys.server_triggers
WHERE type_desc = 'LOGON';

Отключите триггер входа временно, не удаляя его:

DISABLE TRIGGER trigger_name ON ALL SERVER;

Удаление (удаление) триггера входа навсегда:

DROP TRIGGER trigger_name ON ALL SERVER;

Дополнительные сведения см. в разделе "Управление безопасностью триггера".

  • Сценарий 2. У вас нет текущего сеанса, открытого в рамках привилегий администратора, но в SQL Server включено подключение к выделенному администратору (DAC).

    В этом случае можно использовать подключение уровня данных для выполнения тех же действий, описанных в сценарии 1. Триггеры входа не влияют на подключения DAC. Дополнительные сведения о подключении DAC см. в статье " Диагностическое подключение для администраторов баз данных".

    Чтобы проверить, включен ли DAC, просмотрите журнал ошибок 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 использовании функции. Функция EVENTDATA возвращает XML и учитывает регистр. Например, если создать следующий триггер входа для блокировки доступа на основе IP-адреса, может возникнуть ошибка 17892, если в пути XML используется неправильный регистр:

 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

Если при копировании этого скрипта не поддерживается правильная конфиденциальность регистра, в частности в этой части триггера, триггер завершается ошибкой:

-- Incorrect: lowercase 'event_instance' and 'clienthost' will cause EVENTDATA to return NULL
 SELECT EVENTDATA().value ( '(/event_instance/clienthost)[1]' , 'NVARCHAR(15)');

В результате EVENTDATA всегда возвращает значение NULL, а все эквивалентные имена входа SA запрещены. В этом случае, если подключение уровня данных не включено, необходимо перезапустить сервер с параметрами запуска, описанными ранее, чтобы удалить триггер.