Compartir vía


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:

    1. Detenga SQL Server y los servicios relacionados.

    2. Inicie SQL Server desde el símbolo del sistema mediante los parámetros -cde inicio , -my -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.