Condividi tramite


Trigger LOGON

I trigger LOGON consentono di attivare stored procedure in risposta a un evento LOGON generato quando viene stabilita una sessione utente a un'istanza di SQL Server. I trigger LOGON vengono attivati dopo il completamento della fase di autenticazione della procedura di accesso, ma prima che la sessione utente venga effettivamente stabilita. Per questo motivo, tutti i messaggi generati all'interno del trigger che verrebbero normalmente visualizzati all'utente, come i messaggi di errore e i messaggi dall'istruzione PRINT, vengono invece indirizzati al log degli errori di SQL Server. I trigger LOGON non vengono attivati in caso di esito negativo dell'autenticazione.

È possibile utilizzare i trigger LOGON per controllare e gestire le sessioni server, ad esempio tenendo traccia delle attività di accesso, limitando gli accessi a SQL Server o limitando il numero di sessioni per uno specifico account di accesso. Nel codice seguente, ad esempio, il trigger LOGON nega i tentativi di accesso a SQL Server eseguiti dall'account di accesso login_test se esistono già tre sessioni utente in esecuzione create da tale account di accesso.

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;

Si noti che l'evento LOGON corrisponde all'evento di Traccia SQL AUDIT_LOGIN, utilizzabile nelle notifiche di eventi. La principale differenza tra i trigger e le notifiche di eventi è il fatto che i trigger vengono attivati in modo sincrono rispetto agli eventi, mentre le notifiche di eventi sono asincrone. Ciò significa, ad esempio, che se si desidera impedire l'attivazione di una sessione è necessario utilizzare un trigger LOGON. Non è possibile utilizzare una notifica di evento per un evento AUDIT_LOGIN a tale scopo.

Acquisizione dei dati degli eventi per i trigger LOGON

Per acquisire dati XML per gli eventi LOGON da utilizzare in trigger LOGON, è possibile utilizzare la funzione EVENTDATA. Per ulteriori informazioni, vedere Progettazione e implementazione di un'archiviazione strutturata (Motore di database). L'evento LOGON restituisce lo schema di dati di evento seguente:

<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>
    Contiene LOGON.

  • <PostTime>
    Contiene l'ora in cui viene richiesta l'attivazione di una sessione.

  • <SID>
    Contiene il flusso binario codificato in base 64 dell'ID di protezione (SID) per il nome di account di accesso specificato.

  • <ClientHost>
    Contiene il nome host del client da cui viene attivata la connessione. Il valore è '&lt;local_machine&gt;' se il nome del client e del server coincidono. In caso contrario, il valore corrisponde all'indirizzo IP del client.

  • <IsPooled>
    Il valore è 1 se la connessione viene riutilizzata tramite pool di connessioni. In caso contrario, il valore è 0.

Creazione, modifica ed eliminazione di trigger LOGON

I trigger LOGON possono essere creati da qualsiasi database, ma vengono registrati a livello del server e memorizzati nel database master.

Per creare un trigger LOGON

Per modificare un trigger LOGON

Per eliminare un trigger LOGON

Recupero di informazioni sui trigger LOGON

Per visualizzare i metadati relativi ai trigger LOGON, è possibile eseguire una query sulla vista del catalogo sys.server_triggers.