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 in Notifiche degli 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 arrestare 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.
Impostazione del primo e ultimo trigger
È possibile definire più trigger per l'evento LOGON. Uno qualsiasi di questi trigger può essere designato come primo o ultimo trigger da attivare per un evento tramite la stored procedure di sistema sp_settriggerorder. SQL Server non garantisce l'ordine di esecuzione dei trigger rimanenti.
Gestione delle transazioni
Prima dell'attivazione di un trigger LOGON, SQL Server crea una transazione implicita indipendente da qualsiasi altra transazione utente. Per questo motivo, quando viene attivato il primo trigger LOGON il numero di transazioni è 1 e al termine dell'esecuzione di tutti i trigger LOGON viene eseguito il commit della transazione. Come per tutti gli altri tipi di trigger, SQL Server restituisce un errore se l'esecuzione di un trigger LOGON viene completata con un numero di transazioni pari a 0. L'istruzione ROLLBACK TRANSACTION reimposta il numero di transazioni su 0, anche se viene eseguita all'interno di una transazione nidificata. L'istruzione COMMIT TRANSACTION potrebbe ridurre il numero di transazioni a 0. È pertanto consigliabile evitare l'esecuzione di istruzioni COMMIT TRANSACTION all'interno di trigger LOGON.
Tenere presenti le considerazioni seguenti per l'utilizzo di un'istruzione ROLLBACK TRANSACTION all'interno di trigger LOGON:
Viene eseguito il rollback di qualsiasi modifica dei dati eseguita fino al punto dell'istruzione ROLLBACK TRANSACTION. Sono incluse le modifiche apportate dal trigger corrente e quelle apportate da trigger precedenti eseguiti sullo stesso evento. Gli eventuali trigger rimanenti per l'evento specifico non vengono eseguiti.
Il trigger corrente continua l'esecuzione delle istruzioni rimanenti successive all'istruzione ROLLBACK. Se tali istruzioni modificano i dati, non viene eseguito il rollback delle modifiche eseguite.
Non viene stabilita una sessione utente se si verifica una della condizioni seguenti durante l'esecuzione di un trigger per un evento LOGON:
Viene eseguito il rollback della transazione implicita originale o la transazione ha esito negativo.
Viene generato un errore con gravità maggiore di 20 all'interno del corpo del trigger.
Disabilitazione di un trigger di accesso
Un trigger di accesso può impedire le connessioni al Motore di database per tutti gli utenti, inclusi i membri del ruolo predefinito del server sysadmin. Quando un trigger di accesso impedisce le connessioni, i membri del ruolo predefinito del server sysadmin possono connettersi tramite la connessione amministrativa dedicata o avviando il Motore di database nella modalità di configurazione minima (- f). Per ulteriori informazioni, vedere Opzioni di avvio del servizio del motore di database.
Attività correlate
Attività |
Argomento |
---|---|
Viene illustrato come creare trigger di accesso. I trigger LOGON possono essere creati da qualsiasi database, ma vengono registrati a livello del server e memorizzati nel database master. |
|
Viene illustrato come modificare trigger LOGON. |
|
Viene illustrato come eliminare trigger LOGON. |
|
Viene descritto come restituire informazioni sui trigger LOGON. |
|
Viene descritto come acquisire dati degli eventi del trigger LOGON. |