Trigger LOGONLogon Triggers

I trigger LOGON consentono di attivare stored procedure in risposta a un evento LOGONLogon triggers fire stored procedures in response to a LOGON event. generato quando viene stabilita una sessione utente a un'istanza di SQL ServerSQL Server.This event is raised when a user session is established with an instance of SQL ServerSQL 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.Logon triggers fire after the authentication phase of logging in finishes, but before the user session is actually established. 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 ServerSQL Server .Therefore, all messages originating inside the trigger that would typically reach the user, such as error messages and messages from the PRINT statement, are diverted to the SQL ServerSQL Server error log. I trigger LOGON non vengono attivati in caso di esito negativo dell'autenticazione.Logon triggers do not fire if authentication fails.

È 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 ServerSQL Servero limitando il numero di sessioni per uno specifico account di accesso.You can use logon triggers to audit and control server sessions, such as by tracking login activity, restricting logins to SQL ServerSQL Server, or limiting the number of sessions for a specific login. Nel codice seguente, ad esempio, il trigger LOGON nega i tentativi di accesso a SQL ServerSQL Server eseguiti dall'account di accesso login_test se esistono già tre sessioni utente in esecuzione create da tale account di accesso.For example, in the following code, the logon trigger denies log in attempts to SQL ServerSQL Server initiated by login login_test if there are already three user sessions created by that login.

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.Note that the LOGON event corresponds to the AUDIT_LOGIN SQL Trace event, which can be used in Event Notifications. 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.The primary difference between triggers and event notifications is that triggers are raised synchronously with events, whereas event notifications are asynchronous. Ciò significa, ad esempio, che se si desidera arrestare l'attivazione di una sessione è necessario utilizzare un trigger LOGON.This means, for example, that if you want to stop a session from being established, you must use a logon trigger. Non è possibile utilizzare una notifica di evento per un evento AUDIT_LOGIN a tale scopo.An event notification on an AUDIT_LOGIN event cannot be used for this purpose.

Impostazione del primo e ultimo triggerSpecifying First and Last Trigger

È possibile definire più trigger per l'evento LOGON.Multiple triggers can be defined on the LOGON event. 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 .Any one of these triggers can be designated the first or last trigger to be fired on an event by using the sp_settriggerorder system stored procedure. SQL ServerSQL Server non garantisce l'ordine di esecuzione dei trigger rimanenti. does not guarantee the execution order of the remaining triggers.

Gestione delle transazioniManaging Transactions

Prima che SQL ServerSQL Server attivi un trigger LOGON, SQL ServerSQL Server crea una transazione implicita indipendente da qualsiasi altra transazione utente.Before SQL ServerSQL Server fires a logon trigger, SQL ServerSQL Server creates an implicit transaction that is independent from any user transaction. Per questo motivo, quando viene attivato il primo trigger LOGON il numero di transazioni è 1Therefore, when the first logon trigger starts firing, the transaction count is 1. e al termine dell'esecuzione di tutti i trigger LOGON viene eseguito il commit della transazione.After all the logon triggers finish executing, the transaction commits. Come per tutti gli altri tipi di trigger, SQL ServerSQL Server restituisce un errore se l'esecuzione di un trigger LOGON viene completata con un numero di transazioni pari a 0.As with other types of triggers, SQL ServerSQL Server returns an error if a logon trigger finishes execution with a transaction count of 0. L'istruzione ROLLBACK TRANSACTION reimposta il numero di transazioni su 0, anche se viene eseguita all'interno di una transazione nidificata.The ROLLBACK TRANSACTION statement resets the transaction count to 0, even if the statement is issued inside a nested transaction. L'istruzione COMMIT TRANSACTION potrebbe ridurre il numero di transazioni a 0.COMMIT TRANSACTION might decrement the transaction count to 0. È pertanto consigliabile evitare l'esecuzione di istruzioni COMMIT TRANSACTION all'interno di trigger LOGON.Therefore, we advise against issuing COMMIT TRANSACTION statements inside logon triggers.

Tenere presenti le considerazioni seguenti per l'utilizzo di un'istruzione ROLLBACK TRANSACTION all'interno di trigger LOGON:Consider the following when you are using a ROLLBACK TRANSACTION statement inside logon triggers:

  • Viene eseguito il rollback di qualsiasi modifica dei dati eseguita fino al punto dell'istruzione ROLLBACK TRANSACTION.Any data modifications made up to the point of ROLLBACK TRANSACTION are rolled back. Sono incluse le modifiche apportate dal trigger corrente e quelle apportate da trigger precedenti eseguiti sullo stesso evento.These modifications include those made by the current trigger and those made by previous triggers that executed on the same event. Gli eventuali trigger rimanenti per l'evento specifico non vengono eseguiti.Any remaining triggers for the specific event are not executed.

  • Il trigger corrente continua l'esecuzione delle istruzioni rimanenti successive all'istruzione ROLLBACK.The current trigger continues to execute any remaining statements that appear after the ROLLBACK statement. Se tali istruzioni modificano i dati, non viene eseguito il rollback delle modifiche eseguite.If any of these statements modify data, the modifications are not rolled back.

    Non viene stabilita una sessione utente se si verifica una della condizioni seguenti durante l'esecuzione di un trigger per un evento LOGON:A user session is not established if any one of the following conditions occur during execution of a trigger on a LOGON event:

  • Viene eseguito il rollback della transazione implicita originale o la transazione ha esito negativo.The original implicit transaction is rolled back or fails.

  • Viene generato un errore con gravità maggiore di 20 all'interno del corpo del trigger.An error that has severity greater than 20 is raised inside the trigger body.

Disabilitazione di un trigger di accessoDisabling a Logon Trigger

Un trigger di accesso può impedire le connessioni al Motore di databaseDatabase Engine per tutti gli utenti, inclusi i membri del ruolo predefinito del server sysadmin .A logon trigger can effectively prevent successful connections to the Motore di databaseDatabase Engine for all users, including members of the sysadmin fixed server role. 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 databaseDatabase Engine nella modalità di configurazione minima (- f).When a logon trigger is preventing connections, members of the sysadmin fixed server role can connect by using the dedicated administrator connection, or by starting the Motore di databaseDatabase Engine in minimal configuration mode (-f). Per altre informazioni, vedere Opzioni di avvio del servizio del motore di database.For more information, see Database Engine Service Startup Options.

AttivitàTask ArgomentoTopic
Viene illustrato come creare trigger di accesso.Describes how to create logon triggers. I trigger LOGON possono essere creati da qualsiasi database, ma vengono registrati a livello del server e memorizzati nel database master .Logon triggers can be created from any database, but are registered at the server level and reside in the master database. CREATE TRIGGER (Transact-SQL)CREATE TRIGGER (Transact-SQL)
Viene illustrato come modificare trigger LOGON.Describes how to modify logon triggers. ALTER TRIGGER (Transact-SQL)ALTER TRIGGER (Transact-SQL)
Viene illustrato come eliminare trigger LOGON.Describes how to delete logon triggers. DROP TRIGGER (Transact-SQL)DROP TRIGGER (Transact-SQL)
Viene descritto come restituire informazioni sui trigger LOGON.Describes how to return information about logon triggers. sys.server_triggers (Transact-SQL)sys.server_triggers (Transact-SQL)

sys.server_trigger_events (Transact-SQL)sys.server_trigger_events (Transact-SQL)
Viene descritto come acquisire dati degli eventi del trigger LOGON.Describes how to capture logon trigger event data.

Vedere ancheSee Also

Trigger DDLDDL Triggers