Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Trigger di accesso in SQL Server

Un trigger di accesso, come suggerisce il nome, è un trigger che si attiva in risposta a un evento LOGON in SQL Server.

In parole povere, un trigger di accesso viene attivato ogni volta che qualcuno tenta di stabilire una nuova connessione a un server di database. Il trigger si attiva al termine dell'autenticazione dell'utente e del completamento della fase di accesso, ma prima che la sessione dell'utente venga effettivamente avviata.

Vantaggi dei trigger di accesso

Ci sono diversi vantaggi dei trigger di accesso:

  • Tracciamento dell'attività di accesso
    I trigger di accesso possono essere utilizzati per tenere traccia dell'attività di accesso in corso sul server del database. Ad esempio, può essere utilizzato per mantenere un elenco di tutti gli utenti che hanno effettuato l'accesso al server del database entro il periodo di tempo specificato.
  • Limitazione del numero di connessioni totali
    Troppi accessi al database possono influire sulle prestazioni di un database, in particolare quando un numero elevato di utenti accede a un database. In casi come questi, i trigger di accesso possono essere utilizzati per controllare il numero totale di accessi già esistenti prima che ne siano consentiti altri.
  • Limitazione del numero di sessioni per connessione
    È possibile utilizzare un trigger di accesso per limitare il numero di sessioni per connessione. Ogni volta che un utente tenta di stabilire una nuova sessione, un trigger di accesso può controllare il numero di sessioni già attive per quell'accesso e può limitare le nuove sessioni se hanno superato un limite.

Prima di iniziare, assicurati di aver eseguito il backup completo.

Accesso alle connessioni utente attive

Lo script seguente restituisce tutte le connessioni utente attive a un database.

SELECT * FROM sys.dm_exec_sessions

sys.dm_exec_sessions è una vista di sistema che restituisce tutte le connessioni utente attive. L'output della query precedente è simile al seguente:

L'output contiene informazioni dettagliate su tutte le connessioni attive. Siamo interessati a due di queste colonne:is_user_process e original_login_name.
La prima ci dice se la connessione è stata effettuata da un processo utente o meno, e la prima contiene informazioni sul nome della connessione che ha effettuato l'accesso.

Esegui la seguente query:

SELECT is_user_process, original_login_name, *
FROM sys.dm_exec_sessions ORDER BY login_time DESC

La query precedente restituisce is_user_process e original_login_name come prima e seconda colonna insieme al resto di tutte le colonne della vista sys.dm_exec_sessions. Ordina i risultati in base all'ordine decrescente dell'ora di accesso. Quindi, la maggior parte delle connessioni recenti appare in alto.

Nell'output, scorri verso il basso fino alle righe in cui la colonna is_user_process contiene un 1.

Nel mio caso, ho due di queste righe come mostrato nell'output di seguito:

Nella colonna original_login_name, puoi vedere il nome della connessione che ha effettuato il login (in questo caso il nome del mio PC). Nella colonna nome_programma, puoi vedere il tipo di connessione. Nel caso precedente, la connessione con session_id 51 è la connessione con Esplora oggetti di SQL Server. La connessione con session_id 52 è la connessione per l'unica finestra di query in cui viene eseguito lo script. Se hai due finestre di query aperte, vedrai un totale di tre connessioni utente qui e così via.

Per contare il numero totale di connessioni effettuate dai processi utente, eseguire la query seguente:

SELECT COUNT(*) FROM sys.dm_exec_sessions 
WHERE is_user_process = 1

La query precedente ne restituisce due poiché ho solo due connessioni user_process sul mio server.

Trigger di accesso per limitare il numero di accessi

Creiamo un semplice trigger di accesso che limiti a 3 il numero totale di accessi che possono essere effettuati da una connessione. Se la connessione tenta di accedere al server di database per la quarta volta, il trigger di accesso ripristina il processo di accesso.

Lo script per questo trigger è il seguente:

CREATE TRIGGER tr_CheckLogin
ON ALL SERVER
FOR LOGON
AS
BEGIN
	DECLARE @login NVARCHAR(100)
	SET @login = ORIGINAL_LOGIN()

	IF
	(SELECT COUNT(*) FROM sys.dm_exec_sessions 
	WHERE is_user_process = 1
	AND original_login_name = @login) > 3
	BEGIN
	Print 'More than three connections not allowed - Connection by ' + @login + ' Failed'
	ROLLBACK
	END

END

Nello script sopra creiamo un trigger chiamato tr_CheckLogin. L'ambito del trigger è impostato su server.

Puoi visualizzare i dettagli del trigger andando su Esplora oggetti -> Oggetti server -> Trigger, come mostrato nella figura seguente:

Il trigger si attiva ogni volta che si verifica l'evento LOGON, ovvero una connessione tenta di accedere al server. Dai un'occhiata al corpo del grilletto.

La funzione ORIGINAL_LOGIN restituisce il nome del processo utente o della connessione che tenta di accedere al server. Successivamente, il numero totale di connessioni con lo stesso nome viene conteggiato utilizzando la vista sys.dm_exec_session. Se il numero di connessioni è maggiore di 3, il login viene annullato e all'utente viene stampata una dichiarazione che dice:"Più di tre connessioni non consentite - Connessione per 'nome_connessione' non riuscita".

Per verificarlo, apri una nuova finestra di query in SQL Server Management Studio

Nota:in precedenza erano aperte due connessioni, una per SQL Server Management Studio e una per la finestra Query.

Quando provi ad aprire una nuova finestra di query, il trigger tr_CheckLogin si attiverà ma poiché il numero totale di accessi sarà tre in questo momento, il trigger non eseguirà il rollback del login.

Per verificare che il numero totale di connessioni per user_process, eseguire la seguente query:

SELECT COUNT(*) FROM sys.dm_exec_sessions 
WHERE is_user_process = 1

Ora, ci sono un totale di 3 connessioni utente come mostrato nell'output:

Ora prova di nuovo a creare una nuova connessione aprendo una nuova finestra di query in SQL Server Management Studio.

Verrà visualizzato il seguente errore:

L'errore dice che l'accesso non è riuscito per "DESKTOP-GLQ5VRA\Mani" (il nome del mio PC) a causa dell'esecuzione del trigger. Fondamentalmente, il trigger che abbiamo creato non ha consentito la connessione. Attesa! Ma dov'è il messaggio di errore che abbiamo stampato? Non possiamo vederlo qui nella finestra di messaggio sopra. Il messaggio di errore personalizzato che abbiamo scritto nel trigger può essere visualizzato nel registro degli errori.

Per visualizzare il registro degli errori, eseguire il seguente script:

EXECUTE sp_readerrorlog

Scorri verso il basso il registro degli errori fino a trovare il messaggio personalizzato che hai scritto per il trigger di accesso. Lo screenshot seguente mostra il registro degli errori del mio server di database. Il messaggio personalizzato può essere visualizzato nel registro degli errori:

Ulteriori letture:

  • YouTube:trigger di accesso a SQL Server
  • Microsoft.com:trigger di accesso
  • Studi SQL:fuga da un trigger di accesso incontrollato