Compartilhar via


Gatilhos e 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 SQL, que pode ser usado em event notifications. A principal diferença entre gatilhos e notificações de eventos é 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 eventos em um evento AUDIT_LOGIN não pode ser usada para esse fim.

Capturando dados de eventos do gatilho de logon

Para capturar dados XML sobre eventos LOGON para uso nos gatilhos de logon, use a função EVENTDATA. Para obter mais informações, consulte Projetando e implementando o armazenamento estruturado (Mecanismo de Banco de Dados). O evento LOGON retorna o seguinte esquema de dados de evento:

<EVENT_INSTANCE>

    <EventType>event_type</EventType>

    <PostTime>post_time</PostTime>

    <SPID>spid</SPID>

    <ServerName>server_name</ServerName>

<LoginName>login_name</LoginName>

<LoginType>login_type</LoginType>

<SID>sid</SID>

<ClientHost>client_host</ClientHost>

<IsPooled>is_pooled</IsPooled>

</EVENT_INSTANCE>

  • <EventType>
    Contém LOGON.

  • <PostTime>
    Contém a hora em que foi solicitado o estabelecimento de uma sessão.

  • <SID>
    Contém o fluxo binário codificado de base 64 do número de identificação de segurança (SID) do nome de logon especificado.

  • <ClientHost>
    Contém o nome do host do cliente de onde é feita a conexão. O valor será '&lt;local_machine&gt;' se o nome do cliente e do servidor forem idênticos. Caso contrário, o valor é o endereço de IP do cliente.

  • <IsPooled>
    Será 1 se a conexão for reutilizada por meio de pool de conexões. Caso contrário, o valor é 0.

Criando, modificando e descartando gatilhos de logon

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

Para criar um gatilho de logon

Para modificar um gatilho de logon

Para descartar um gatilho de logon

Obtendo informações sobre gatilhos de logon

Você pode visualizar metadados sobre gatilhos de logon consultando a exibição do catálogo sys.server_triggers.