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 è '<local_machine>' 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.