Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Déclencheurs d'ouverture de session dans SQL Server

Un déclencheur de connexion, comme son nom l'indique, est un déclencheur qui se déclenche en réponse à un événement LOGON dans SQL Server.

En termes simples, un déclencheur de connexion se déclenche chaque fois que quelqu'un tente d'établir une nouvelle connexion à un serveur de base de données. Le déclencheur se déclenche une fois l'authentification de l'utilisateur et la phase de connexion terminées, mais avant que la session utilisateur ne soit réellement lancée.

Avantages des déclencheurs de connexion

Les déclencheurs de connexion présentent plusieurs avantages :

  • Suivi de l'activité de connexion
    Les déclencheurs de connexion peuvent être utilisés pour suivre l'activité de connexion en cours sur le serveur de base de données. Par exemple, il peut être utilisé pour maintenir une liste de tous les utilisateurs qui se sont connectés au serveur de base de données au cours de la période spécifiée.
  • Restriction du nombre total de connexions
    Trop de connexions à la base de données peuvent affecter les performances d'une base de données, en particulier lorsqu'un grand nombre d'utilisateurs accèdent à une base de données. Dans des cas comme ceux-ci, les déclencheurs de connexion peuvent être utilisés pour vérifier le nombre total de connexions déjà existantes avant que d'autres ne soient autorisées.
  • Restriction du nombre de sessions par connexion
    Un déclencheur de connexion peut être utilisé pour limiter le nombre de sessions par connexion. Chaque fois qu'un utilisateur tente d'établir une nouvelle session, un déclencheur de connexion peut vérifier le nombre de sessions déjà actives pour cette connexion et peut restreindre toute nouvelle session si elle a dépassé une limite.

Avant de commencer, assurez-vous que vous êtes entièrement sauvegardé.

Accéder aux connexions des utilisateurs actifs

Le script suivant renvoie toutes les connexions utilisateur actives à une base de données.

SELECT * FROM sys.dm_exec_sessions

sys.dm_exec_sessions est une vue système qui renvoie toutes les connexions utilisateur actives. Le résultat de la requête ci-dessus ressemble à ceci :

La sortie contient des informations détaillées sur toutes les connexions actives. Deux de ces colonnes nous intéressent :is_user_process et original_login_name.
La première nous indique si la connexion a été établie par un processus utilisateur ou non, et la première contient des informations sur le nom de la connexion qui a établi la connexion.

Exécutez la requête suivante :

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

La requête ci-dessus renvoie is_user_process et original_login_name comme première et deuxième colonnes avec le reste de toutes les colonnes de la vue sys.dm_exec_sessions. Il trie les résultats par ordre décroissant de l'heure de connexion. Par conséquent, les connexions les plus récentes apparaissent en haut.

Dans la sortie, faites défiler jusqu'aux lignes où la colonne is_user_process contient un 1.

Dans mon cas, j'ai deux lignes de ce type, comme indiqué dans la sortie ci-dessous :

Dans la colonne original_login_name, vous pouvez voir le nom de la connexion qui a établi la connexion (Dans ce cas, le nom de mon PC). Dans la colonne program_name, vous pouvez voir le type de connexion. Dans le cas ci-dessus, la connexion avec le session_id 51 est la connexion avec l'explorateur d'objets SQL Server. La connexion avec le session_id 52 est la connexion pour la seule fenêtre de requête dans laquelle le script est exécuté. Si vous avez deux fenêtres de requête ouvertes, vous verrez un total de trois connexions utilisateur ici, et ainsi de suite.

Pour compter le nombre total de connexions effectuées par les processus utilisateur, exécutez la requête suivante :

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

La requête ci-dessus en renvoie deux puisque je n'ai que deux connexions user_process sur mon serveur.

Déclencheur de connexion pour limiter le nombre de connexions

Créons un déclencheur de connexion simple qui limite à 3 le nombre total de connexions pouvant être effectuées par une connexion. Si la connexion tente de se connecter au serveur de base de données pour la quatrième fois, le déclencheur de connexion annule le processus de connexion.

Le script de ce déclencheur est le suivant :

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

Dans le script ci-dessus, nous créons un déclencheur nommé tr_CheckLogin. La portée du déclencheur est définie sur le serveur.

Vous pouvez afficher les détails du déclencheur en accédant à Explorateur d'objets -> Objets serveur -> Déclencheurs, comme indiqué dans la figure ci-dessous :

Le déclencheur se déclenche chaque fois que l'événement LOGON a lieu, c'est-à-dire qu'une connexion tente de se connecter au serveur. Examinez attentivement le corps de la gâchette.

La fonction ORIGINAL_LOGIN renvoie le nom du processus utilisateur ou de la connexion essayant de se connecter au serveur. Ensuite, le nombre total de connexions portant le même nom est compté à l'aide de la vue sys.dm_exec_session. Si le nombre de connexions est supérieur à 3, la connexion est annulée et une déclaration est imprimée à l'utilisateur indiquant :"Plus de trois connexions non autorisées - Échec de la connexion par 'connection_name'".

Pour le vérifier, ouvrez une nouvelle fenêtre de requête dans le studio de gestion SQL Server

Remarque :Auparavant, deux connexions étaient ouvertes, une pour SQL Server Management Studio et une pour la fenêtre de requête.

Lorsque vous essayez d'ouvrir une nouvelle fenêtre de requête, le déclencheur tr_CheckLogin se déclenche, mais comme le nombre total de connexions sera de trois à ce stade, le déclencheur n'annulera pas la connexion.

Pour vérifier que le nombre total de connexion par user_process, exécutez la requête suivante :

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

Maintenant, il y a au total 3 connexions utilisateur, comme indiqué dans la sortie :

Maintenant, essayez à nouveau de créer une nouvelle connexion en ouvrant une nouvelle fenêtre de requête dans SQL Server Management Studio.

Vous verrez l'erreur suivante :

L'erreur indique que la connexion a échoué pour "DESKTOP-GLQ5VRA\Mani" (le nom de mon PC) en raison de l'exécution du déclencheur. Fondamentalement, le déclencheur que nous avons créé n'autorisait pas la connexion. Attendre! Mais où est le message d'erreur que nous avons imprimé ? Nous ne pouvons pas le voir ici dans la boîte de message ci-dessus. Le message d'erreur personnalisé que nous avons écrit dans le déclencheur peut être consulté dans le journal des erreurs.

Pour afficher le journal des erreurs, exécutez le script suivant :

EXECUTE sp_readerrorlog

Faites défiler le journal des erreurs jusqu'à ce que vous trouviez le message personnalisé que vous avez écrit pour le déclencheur de connexion. La capture d'écran suivante montre le journal des erreurs de mon serveur de base de données. Le message personnalisé peut être vu dans le journal des erreurs :

Autres lectures :

  • YouTube :Déclencheurs de connexion SQL Server
  • Microsoft.com :déclencheurs de connexion
  • Études SQL :échapper à un déclencheur d'ouverture de session incontrôlable