Partekatu honen bidez:


MSSQLSERVER_17892

Se aplica a:SQL Server

Detalles

Atributo Valor
Nombre del producto Servidor SQL
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 siguiente mensaje de error se notifica al usuario:

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 resoluciones 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.

Administración de desencadenadores de inicio de sesión

Enumere todos los desencadenadores de inicio de sesión en el servidor:

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

Deshabilite un desencadenador de inicio de sesión temporalmente sin eliminarlo:

DISABLE TRIGGER trigger_name ON ALL SERVER;

Quitar (eliminar) un desencadenador de inicio de sesión de forma permanente:

DROP TRIGGER trigger_name ON ALL SERVER;

Para obtener más información, consulte Administración de la seguridad del desencadenador.

  • 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 realizar los mismos pasos descritos en escenario 1. Los desencadenadores de inicio de sesión no afectan a las conexiones DAC. 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, revise el registro de errores de SQL Server. Busque un mensaje similar a este ejemplo:

    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: la DAC no está habilitada en el servidor y no 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. Esta acción deshabilita el desencadenador de inicio de sesión y le permite realizar las mismas medidas correctivas descritas en escenario 1.

      Nota:

      Este procedimiento requiere una cuenta de administrador del sistema (SA) o 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.

Más información

Los desencadenadores de inicio de sesión también pueden producir un error al usar la EVENTDATA función incorrectamente. La EVENTDATA función devuelve XML y distingue mayúsculas de minúsculas. Por ejemplo, si crea el siguiente desencadenador de inicio de sesión para bloquear el acceso en función de la dirección IP, es posible que encuentre el error 17892 si la ruta de acceso XML usa mayúsculas y minúsculas incorrectas:

 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

Si no mantiene la distinción de mayúsculas y minúsculas adecuada al copiar este script, específicamente en esta parte del desencadenador, se produce un error en el desencadenador:

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

Como consecuencia, EVENTDATA siempre devuelve NULL y se deniega el acceso a todos los inicios de sesión equivalentes de SA. En este caso, si la conexión DAC no está habilitada, debe reiniciar el servidor con los parámetros de inicio descritos anteriormente para quitar el desencadenador.