Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: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.
В такой ситуации единственным способом устранения проблемы является выполнение указанных ниже действий.
Остановите SQL Server и связанные службы.
Запустите 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 запрещены. В этом случае, если подключение уровня данных не включено, необходимо перезапустить сервер с параметрами запуска, описанными ранее, чтобы удалить триггер.