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.