Compartilhar via


Gatilhos de logon

O logon dispara 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 a fase de autenticação do logon ser concluída, mas antes que a sessão do usuário seja realmente estabelecida. Portanto, todas as mensagens originadas dentro do gatilho que normalmente alcançariam o 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 serão acionados se a autenticação falhar.

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

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 de rastreamento SQL AUDIT_LOGIN, que pode ser utilizado em Notificações de Eventos. A principal diferença entre gatilhos e notificações de evento é que os gatilhos são gerados de forma síncrona com eventos, enquanto as notificações de evento são assíncronas. Isso significa, por exemplo, que se você quiser impedir que uma sessão seja estabelecida, use um gatilho de logon. Uma notificação de evento em um evento AUDIT_LOGIN não pode ser usada para essa finalidade.

Especificando o primeiro e o último gatilho

Vários gatilhos podem ser definidos no evento LOGON. Qualquer um desses gatilhos pode ser designado como o primeiro ou último gatilho a ser disparado em um evento usando o 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. Portanto, quando o primeiro gatilho de logon começa a ser disparado, a contagem de transações é 1. Depois que todos os gatilhos de logon terminarem de ser executados, a transação será confirmada. Assim como acontece com outros tipos de gatilhos, o SQL Server retornará um erro se um gatilho de logon concluir a execução com uma contagem de transações de 0. A instrução ROLLBACK TRANSACTION reseta a contagem de transações para 0, mesmo que a instrução seja emitida dentro de uma transação aninhada. COMMIT TRANSACTION pode diminuir a contagem de transações para 0. Portanto, aconselhamos que não se emitam instruções COMMIT TRANSACTION dentro de gatilhos de logon.

Considere o seguinte quando você estiver usando uma instrução ROLLBACK TRANSACTION dentro de gatilhos de logon:

  • Todas as modificações de dados feitas até o ponto de ROLLBACK TRANSACTION são revertidas. Essas modificações incluem aquelas feitas pelo gatilho atual e aquelas feitas por gatilhos anteriores executados no mesmo evento. Os gatilhos restantes para o evento específico não são executados.

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

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

  • A transação implícita original é revertida ou falha.

  • Um erro com gravidade maior que 20 é gerado dentro do corpo do gatilho.

Desabilitando um gatilho de logon

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

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 eventos de gatilho de logon.

Consulte Também

Gatilhos DDL