Condividi tramite


Trigger LOGON

I trigger LOGON consentono di attivare stored procedure in risposta a un evento LOGON Questo evento viene generato quando viene stabilita una sessione utente con 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. Di conseguenza, tutti i messaggi originati all'interno del trigger che in genere raggiungono l'utente, ad esempio messaggi di errore e messaggi dall'istruzione PRINT, vengono deviati nel log degli errori SQL Server. I trigger LOGON non vengono attivati in caso di esito negativo dell'autenticazione.

È possibile usare i trigger di accesso per controllare e controllare le sessioni del server, ad esempio monitorando l'attività di accesso, limitando gli account di accesso a SQL Server o limitando il numero di sessioni per un account di accesso specifico. Nel codice seguente, ad esempio, il trigger di accesso nega i tentativi di accesso di SQL Server avviati dall'account di accesso login_test se sono già presenti tre sessioni utente 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, che può essere usato 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 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 usando la stored procedure di sistema sp_settriggerorder . SQL Server non garantisce l'ordine di esecuzione dei trigger rimanenti.

Gestione delle transazioni

Prima che SQL Server venga attivato un trigger di accesso, SQL Server crea una transazione implicita indipendente da qualsiasi 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 altri tipi di trigger, SQL Server restituisce un errore se un trigger di accesso termina l'esecuzione 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 in modo efficace le connessioni al motore di database per tutti gli utenti, inclusi i membri del ruolo predefinito del sysadmin server. Quando un trigger di accesso impedisce le connessioni, i membri del ruolo predefinito del sysadmin server possono connettersi tramite la connessione amministrativa dedicata o avviando il motore di database in modalità di configurazione minima (-f). Per altre informazioni, vedere Opzioni di avvio del servizio del motore di database.

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 . CREATE TRIGGER (Transact-SQL)
Viene illustrato come modificare trigger LOGON. ALTER TRIGGER (Transact-SQL)
Viene illustrato come eliminare trigger LOGON. DROP TRIGGER (Transact-SQL)
Viene descritto come restituire informazioni sui trigger LOGON. sys.server_triggers (Transact-SQL)

sys.server_trigger_events (Transact-SQL)
Viene descritto come acquisire dati degli eventi del trigger LOGON.

Vedere anche

Trigger DDL