Compartir a través de


MSSQLSERVER_17892

Se aplica a:SQL Server

Detalles

Atributo Value
Nombre de 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 de 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 el objeto al que hace referencia el código del desencadenador no existe, cree el objeto para que el desencadenador de inicio de sesión pueda ejecutarse correctamente.

    • Ejemplo 2: Si el objeto al que hace referencia el código del desencadenador existe, pero los usuarios no tienen permisos, concédales los privilegios necesarios para acceder al objeto.

    De forma 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 administración, pero la 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 de administrador dedicada (DAC), vea: Conexión de diagnóstico para administradores de bases de datos.

    Para comprobar si la conexión DAC está habilitada en su instancia de SQL Server, revise si hay un mensaje similar al siguiente en el registro de errores de SQL Server:

    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 una conexión DAC habilitada en el servidor ni una sesión de administrador para 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 con los parámetros de inicio -c, -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, vea: Opciones de inicio del servicio de motor de base de datos.

Más información

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, cree el siguiente desencadenador de inicio de sesión, con la intención de bloquear el acceso en función de la dirección IP, puede encontrarse con 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.