Gatilhos de logon

Os gatilhos de logon acionam procedimentos armazenados em resposta a um evento LOGON. Esse evento ocorre quando é estabelecida uma sessão de usuário 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 realmente estabelecida. Logo, todas as mensagens originadas no gatilho que chegariam, normalmente, 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 gatilhos de logon para auditar e controlar sessões do servidor, por exemplo, rastreando a atividade de logon, restringindo os logons ao SQL Server ou limitando o número de sessões para um logon específico. Por exemplo, no código abaixo, o gatilho de logon negará as tentativas de logon no SQL Server iniciadas por login_test quando já houver três sessões de usuário criadas pelo logon em questão.

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;

Observe que o evento LOGON corresponde ao evento AUDIT_LOGIN do Rastreamento do SQL, 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.

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

Gerenciando transações

Antes de o SQL Server disparar um gatilho de logon, o SQL Server cria uma transação implícita 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. Como em outros tipos de gatilhos, o SQL Server retornará um erro se o gatilho de logon terminar a execução com uma contagem de transações de 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. Isso inclui modificações feitas pelo gatilho atual e por gatilhos anteriores executados no mesmo evento. Quaisquer gatilhos restantes para o evento específico não são executados.

  • O gatilho atual continua a executar todas as instruções restantes que apareçam depois da 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.

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

Tarefas relacionadas

Tarefa

Tópico

Descreve como criar gatilhos de logon. Os gatilhos de logon podem ser criados a partir de qualquer banco de dados, mas são registrados no nível do servidor e residem no banco de dados mestre.

CREATE TRIGGER (Transact-SQL)

Descreve como modificar gatilhos de logon.

ALTER TRIGGER (Transact-SQL)

Descreve como excluir gatilhos de logon.

DROP TRIGGER (Transact-SQL)

Descreve como retornar informações sobre gatilhos de logon.

sys.server_triggers (Transact-SQL)

sys.server_trigger_events (Transact-SQL)

Descreve como capturar dados de evento do gatilho de logon.

Consulte também

Conceitos

Gatilhos DDL