MSSQLSERVER_17892
Se aplica a: SQL Server
Detalles
Attribute | Valor |
---|---|
Nombre del producto | SQL Server |
Id. de evento | 17892 |
Origen de eventos | MSSQLSERVER |
Componente | SQLEngine |
Nombre simbólico | SRV_LOGON_FAILED_BY_TRIGGER |
Texto del mensaje | Error de inicio de sesión para el nombre> de inicio de sesión <debido a la ejecución del desencadenador. |
Explicación
El error 17892 se produce cuando un código del desencadenador de inicio de sesión no se puede ejecutar correctamente. Los desencadenadores de inicio de sesión activan procedimientos almacenados en respuesta a un evento LOGON. Este evento se genera cuando se establece una sesión de usuario con una instancia de SQL Server. El usuario recibe un mensaje de error similar al siguiente:
Mensaje 17892, nivel 14, estado 1, nombre> del servidor<, línea 1
Error de inicio de sesión para el nombre> de inicio de sesión <debido a la ejecución del desencadenador.
Causas posibles:
El problema puede producirse si hay un error al ejecutar el código del desencadenador para esa cuenta de usuario en concreto. Algunos de los escenarios incluyen:
- El desencadenador intenta insertar datos en una tabla que no existe.
- El inicio de sesión no tiene permisos para el objeto al que hace referencia el desencadenador de inicio de sesión.
Acción del usuario
Puede usar una de las siguientes soluciones en función de su escenario.
Escenario 1: Actualmente tiene acceso a una sesión abierta a SQL Server en una cuenta de administrador.
En este caso, puede llevar a cabo la acción correctiva necesaria para corregir el código del desencadenador.
Ejemplo 1: si no existe un objeto al que hace referencia el código del desencadenador, cree ese objeto para que el desencadenador de inicio de sesión pueda ejecutarse correctamente.
Ejemplo 2: si existe un objeto al que hace referencia el código de desencadenador, pero los usuarios no tienen permisos, concédales los privilegios necesarios para acceder al objeto.
Como alternativa, puede quitar o deshabilitar el desencadenador de inicio de sesión para que los usuarios puedan seguir iniciando sesión en SQL Server.
Escenario 2: no tiene ninguna sesión actual abierta con privilegios de administrador, pero conexión de administrador dedicada (DAC) está habilitada en SQL Server.
En este caso, puede usar la conexión DAC para seguir los pasos descritos en el escenario 1, ya que las conexiones DAC no se ven afectadas por los desencadenadores de inicio de sesión. Para obtener más información sobre la conexión DAC, consulte: Conexión de diagnóstico para administradores de bases de datos.
Para comprobar si la DAC está habilitada en SQL Server, puede comprobar el registro de errores de SQL Server para ver un mensaje similar al siguiente:
2020-02-09 16:17:44.150 Servidor Se estableció la compatibilidad con la conexión de administración dedicada para escuchar localmente en el puerto 1434.
Escenario 3: no tiene ninguna DAC habilitada en el servidor ni tiene una sesión de administrador existente en SQL Server.
En este escenario, la única forma de corregir el problema sería realizar los pasos siguientes:
Detenga SQL Server y los servicios relacionados.
Inicie SQL Server desde el símbolo del sistema mediante los parámetros
-c
de inicio ,-m
y-f
. Esto deshabilita el desencadenador de inicio de sesión y le permite tomar las mismas medidas correctivas descritas anteriormente en el escenario 1.Nota:
El procedimiento anterior requiere una cuenta de administrador del sistema o una cuenta de administrador equivalente.
Para obtener más información sobre estas y otras opciones de inicio, consulte: Motor de base de datos Opciones de inicio del servicio.
Información adicional
Otra situación en la que se produce un error en los desencadenadores de inicio de sesión es cuando se usa la función EVENTDATA
. Esta función devuelve XML y distingue mayúsculas de minúsculas. Por lo tanto, si crea el siguiente desencadenador de inicio de sesión, que intenta bloquear el acceso basado en la dirección IP, se puede producir el problema:
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
El usuario no respetó las mayúsculas y minúsculas al copiar este script de Internet en esta parte del desencadenador:
SELECT EVENTDATA().value ( '(/event_instance/clienthost)[1]' , 'NVARCHAR(15)');
Como consecuencia, EVENTDATA
siempre devolvía NULL y se denegaba el acceso a todos los inicios de sesión equivalentes a cuentas de administrador del sistema. En este caso, la conexión DAC no estaba habilitada, por lo que la única solución era reiniciar el servidor con los parámetros de inicio enumerados anteriormente para quitar el desencadenador.