Gatilhos de logon

Aplica-se a: SQL Server Instância Gerenciada de SQL do Azure

Gatilhos de logon disparam procedimentos armazenados em resposta a um evento LOGON. Esse evento é gerado quando uma sessão de usuário é estabelecida com uma instância do SQL Server. Os gatilhos de logon são acionados após o término da fase de autenticação, mas antes da sessão de usuário ser estabelecida. Portanto, todas as mensagens originadas dentro do gatilho que normalmente chegariam ao usuário, como mensagens de erro e mensagens da instrução PRINT, são desviadas para o log de erros do SQL Server. Os gatilhos de logon não são acionados quando a autenticação falha.

Você pode usar os gatilhos de logon para auditar e controlar as sessões do servidor, por exemplo, rastreando a atividade de logon, restringindo os logins ao SQL Server ou limitando o número de sessões para um login específico. Por exemplo, no código a seguir, o gatilho de logon nega tentativas de logon no SQL Server iniciadas pelo login login_test se já houver três sessões de usuário criadas por esse login.

USE master;
GO

CREATE LOGIN login_test
WITH PASSWORD = N'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 N'login_test'
FOR LOGON AS BEGIN
    IF ORIGINAL_LOGIN() = N'login_test'
    AND (
        SELECT COUNT(*)
        FROM sys.dm_exec_sessions
        WHERE is_user_process = 1
            AND original_login_name = N'login_test') > 3
    ROLLBACK;
END;

O evento LOGON corresponde ao evento AUDIT_LOGIN SQL Trace, que pode ser usado em Notificações de eventos. A principal diferença entre gatilhos e notificações de evento é que os primeiros ocorrem de maneira síncrona com os eventos, ao passo que os últimos são assíncronos. Isso significa, por exemplo, que se quiser interromper o estabelecimento de uma sessão, você deve usar um gatilho de logon. Uma notificação de evento em um evento AUDIT_LOGIN não pode ser usada para esse fim.

Especificar o primeiro e o último gatilhos

Vários gatilhos podem ser definidos no evento LOGON. Qualquer um deles pode ser designado como o primeiro ou último gatilho a ser disparado mediante em um evento por meio do procedimento armazenado do sistema sp_settriggerorder . O SQL Server não garante a ordem de execução dos gatilhos restantes.

Gerenciar transações

Antes de o SQL Server disparar um gatilho de logon, ele cria uma transação implícita que é independente de qualquer transação de usuário. Assim, quando o primeiro gatilho de logon é acionado, a contagem de transações é 1. Terminada a execução de todos os gatilhos de logon, a transação é confirmada. Assim como ocorre com outros tipos de gatilhos, o SQL Server retorna um erro se um gatilho de logon terminar a execução com uma contagem de transações igual a 0. A instrução ROLLBACK TRANSACTION zera a contagem de transações, mesmo quando é emitida dentro de uma transação aninhada. COMMIT TRANSACTION pode decrementar a contagem de transações para 0. Logo, nós não aconselhamos emitir instruções COMMIT TRANSACTION dentro de gatilhos de logon.

Considere o seguinte ao usar uma instrução ROLLBACK TRANSACTION dentro de gatilhos de logon:

  • Toda modificação de dados efetuada até o ponto de ROLLBACK TRANSACTION é revertida. Essas modificações incluem alterações feitas pelo acionador atual e por acionadores anteriores que foram executados no mesmo evento. Quaisquer gatilhos restantes para o evento específico não são executados.

  • O acionador atual continua a executar todas as instruções restantes que aparecem após a instrução ROLLBACK. Se alguma dessas instruções modificar dados, as modificações não serão revertidas.

Não será estabelecida uma sessão de usuário se ocorrer uma das seguintes condições durante a execução de um gatilho em um evento LOGON:

  • A transação implícita original é revertida ou falha.
  • Um erro com severidade maior que 20 é emitido dentro do corpo do gatilho.

Desabilitar um gatilho de logon

Um gatilho de logon pode, efetivamente, impedir conexões com o Mecanismo de Banco de Dados para todos os usuários, incluindo membros da função de servidor fixa sysadmin . Quando um gatilho de logon está impedindo conexões, os membros da função de servidor fixa sysadmin podem se conectar usando a conexão de administrador dedicada ou iniciando o Mecanismo de Banco de Dados no modo de configuração mínima (-f). Para obter mais informações, consulte Opções de inicialização do serviço Mecanismo de Banco de Dados.