Desencadenadores logon

Los desencadenadores LOGON 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. Los desencadenadores logon se activan después de que termine la fase de autenticación del inicio de sesión, pero antes de que se establezca la sesión de usuario realmente. Por tanto, todos los mensajes que se originan dentro del desencadenador que alcanzaría normalmente el usuario, como los mensajes de error y los mensajes de la instrucción PRINT, se desvían al registro de errores de SQL Server. Los desencadenadores logon no se activan si se produce un error en la autenticación.

Puede utilizar desencadenadores logon para realizar auditorías y controlar sesiones de servidor, como el seguimiento de la actividad de inicio de sesión, la restricción de inicios de sesión en SQL Server o la limitación del número de sesiones para un inicio de sesión específico. Por ejemplo, en el siguiente código, el desencadenador logon rechaza los intentos de iniciar sesión en SQL Server iniciados por el inicio de sesión login_test si ya hay tres sesiones de usuario creadas por dicho inicio de sesión.

USE master;
GO
CREATE LOGIN login_test WITH PASSWORD = '3KHJ6dhx(0xVYsdf' MUST_CHANGE,
    CHECK_EXPIRATION = ON;
GO
GRANT VIEW SERVER STATE TO login_test;
GO
CREATE TRIGGER connection_limit_trigger
ON ALL SERVER WITH EXECUTE AS 'login_test'
FOR LOGON
AS
BEGIN
IF ORIGINAL_LOGIN()= 'login_test' AND
    (SELECT COUNT(*) FROM sys.dm_exec_sessions
            WHERE is_user_process = 1 AND
                original_login_name = 'login_test') > 3
    ROLLBACK;
END;

Tenga en cuenta que el evento LOGON se corresponde con el evento de Seguimiento de SQL AUDIT_LOGIN, que se puede usar en Notificaciones de eventos. La diferencia principal entre los desencadenadores y las notificaciones de eventos radica en que los desencadenadores se generan de forma sincrónica con los eventos, mientras que las notificaciones de eventos son asincrónicas. Esto significa, por ejemplo, que si desea que no se establezca una sesión, debe utilizar un desencadenador logon. Para este fin, no se puede usar una notificación de eventos en un evento AUDIT_LOGIN.

Especificar el primer y el último desencadenador

Se pueden definir varios desencadenadores en el evento LOGON. Cualquiera de estos desencadenadores se puede designar como el primero o el último en activarse en un evento mediante el procedimiento almacenado del sistema sp_settriggerorder. SQL Server no garantiza el orden de ejecución del resto de desencadenadores.

Administrar transacciones

Antes de que SQL Server active un desencadenador logon, SQL Server crea una transacción implícita que es independiente de cualquier transacción de usuario. Por consiguiente, cuando el primer desencadenador LOGON inicia la activación, el recuento de transacciones es 1. Una vez que todos los desencadenadores LOGON finalizan su ejecución, se confirma la transacción. Al igual que ocurre con otros tipos de desencadenadores, SQL Server devuelve un error si un desencadenador LOGON termina de ejecutarse con un recuento de transacciones de 0. La instrucción ROLLBACK TRANSACTION restablece el recuento de transacciones en 0, incluso si la instrucción se ha emitido desde una transacción anidada. COMMIT TRANSACTION puede reducir el recuento de transacciones a 0. Por tanto, aconsejamos que no se emitan instrucciones COMMIT TRANSACTION desde desencadenadores LOGON.

Piense lo siguiente cuando esté utilizando una instrucción ROLLBACK TRANSACTION dentro de los desencadenadores logon:

  • Se revierten todas las modificaciones de datos realizadas antes de emitir la instrucción ROLLBACK TRANSACTION. Estas modificaciones incluyen las realizadas por el desencadenador actual y las realizadas por desencadenadores anteriores ejecutados en el mismo evento. No se ejecutan los desencadenadores restantes para el evento específico.

  • El desencadenador actual continúa ejecutando cualquier instrucción restante que aparezca después de la instrucción ROLLBACK. Si alguna de estas instrucciones modifica datos, no se revierten las modificaciones.

Una sesión de usuario no está establecida si se produce cualquiera de las siguientes condiciones durante la ejecución de un desencadenador en un evento LOGON:

  • La transacción implícita original se revierte o produce un error.

  • Un error con una gravedad mayor que 20 se genera dentro del cuerpo del desencadenador.

Deshabilitar un desencadenador logon

Un desencadenador logon puede impedir la conexión al Motor de base de datos de todos los usuarios, incluidos los miembros del rol fijo de servidor sysadmin. Cuando el desencadenador logon impide que se realicen las conexiones, los miembros del rol fijo de servidor sysadmin pueden conectarse mediante la conexión de administrador dedicada o iniciando el Motor de base de datos en modo de configuración mínima (-f). Para obtener más información, vea Opciones de inicio del servicio de motor de base de datos.

Tareas relacionadas

Tarea

Tema

Describe cómo crear los desencadenadores logon. Los desencadenadores logon se pueden crear desde cualquier base de datos, pero se registran en el nivel de servidor y residen en la base de datos maestra.

CREATE TRIGGER (Transact-SQL)

Describe cómo modificar los desencadenadores logon.

ALTER TRIGGER (Transact-SQL)

Describe cómo eliminar los desencadenadores logon.

DROP TRIGGER (Transact-SQL)

Describe cómo devolver información acerca de los desencadenadores logon.

sys.server_triggers (Transact-SQL)

sys.server_trigger_events (Transact-SQL)

Describe cómo capturar los datos de evento de desencadenador logon.

Vea también

Conceptos

Desencadenadores DDL