Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Anmeldeauslöser in SQL Server

Ein Logon-Trigger ist, wie der Name schon sagt, ein Trigger, der als Reaktion auf ein LOGON-Ereignis in SQL Server ausgelöst wird.

Einfach ausgedrückt wird ein Logon-Trigger immer dann ausgelöst, wenn jemand versucht, eine neue Verbindung zu einem Datenbankserver herzustellen. Der Trigger wird ausgelöst, nachdem die Benutzerauthentifizierung und die Anmeldephase abgeschlossen sind, aber bevor die Benutzersitzung tatsächlich initiiert wird.

Vorteile von Logon-Triggern

Logon-Trigger haben mehrere Vorteile:

  • Verfolgung der Anmeldeaktivitäten
    Anmeldeauslöser können verwendet werden, um die Anmeldeaktivitäten zu verfolgen, die auf dem Datenbankserver stattfinden. Beispielsweise kann es verwendet werden, um eine Liste aller Benutzer zu führen, die sich innerhalb des angegebenen Zeitraums beim Datenbankserver angemeldet haben.
  • Beschränkung der Anzahl der Gesamtverbindungen
    Zu viele Datenbankanmeldungen können die Leistung einer Datenbank beeinträchtigen, insbesondere wenn eine große Anzahl von Benutzern auf eine Datenbank zugreift. In Fällen wie diesen können Anmeldeauslöser verwendet werden, um die Anzahl der bereits vorhandenen Gesamtanmeldungen zu überprüfen, bevor weitere zugelassen werden.
  • Beschränkung der Anzahl der Sitzungen pro Verbindung
    Ein Logon-Trigger kann verwendet werden, um die Anzahl der Sitzungen pro Verbindung zu begrenzen. Immer wenn ein Benutzer versucht, eine neue Sitzung aufzubauen, kann ein Anmeldeauslöser die Anzahl der Sitzungen überprüfen, die für diese Anmeldung bereits aktiv sind, und alle neuen Sitzungen einschränken, wenn sie ein Limit überschritten haben.

Bevor wir beginnen, vergewissern Sie sich, dass Sie vollständig gesichert sind.

Zugriff auf aktive Benutzerverbindungen

Das folgende Skript gibt alle aktiven Benutzerverbindungen an eine Datenbank zurück.

SELECT * FROM sys.dm_exec_sessions

sys.dm_exec_sessions ist eine Systemansicht, die alle aktiven Benutzerverbindungen zurückgibt. Die Ausgabe der obigen Abfrage sieht folgendermaßen aus:

Die Ausgabe enthält detaillierte Informationen zu allen aktiven Verbindungen. Wir interessieren uns für zwei dieser Spalten:is_user_process und original_login_name.
Die erstere sagt uns, ob die Verbindung von einem Benutzerprozess hergestellt wurde oder nicht, und die erstere enthält Informationen über den Namen der Verbindung, die die Anmeldung vorgenommen hat.

Führen Sie die folgende Abfrage aus:

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

Die obige Abfrage gibt is_user_process und original_login_name als erste und zweite Spalte zusammen mit den restlichen Spalten aus der Ansicht sys.dm_exec_sessions zurück. Es sortiert die Ergebnisse in absteigender Reihenfolge der Anmeldezeit. Daher erscheinen die letzten Verbindungen ganz oben.

Scrollen Sie in der Ausgabe nach unten zu den Zeilen, in denen die Spalte is_user_process eine 1 enthält.

In meinem Fall habe ich zwei solcher Zeilen, wie in der Ausgabe unten gezeigt:

In der Spalte original_login_name sehen Sie den Namen der Verbindung, die die Anmeldung vorgenommen hat (in diesem Fall der Name meines PCs). In der Spalte program_name sehen Sie den Verbindungstyp. Im obigen Fall ist die Verbindung mit der session_id 51 die Verbindung mit dem SQL Server Object Explorer. Die Verbindung mit der session_id 52 ist die Verbindung für das einzige Abfragefenster, in dem das Skript ausgeführt wird. Wenn Sie zwei Abfragefenster geöffnet haben, sehen Sie hier insgesamt drei Benutzerverbindungen und so weiter.

Führen Sie die folgende Abfrage aus, um die Gesamtzahl der von Benutzerprozessen hergestellten Verbindungen zu zählen:

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

Die obige Abfrage gibt zwei zurück, da ich nur zwei user_process-Verbindungen auf meinem Server habe.

Anmeldeauslöser zur Begrenzung der Anzahl an Anmeldungen

Lassen Sie uns einen einfachen Logon-Trigger erstellen, der die Gesamtzahl der Anmeldungen, die von einer Verbindung vorgenommen werden können, auf 3 begrenzt. Wenn die Verbindung zum vierten Mal versucht, sich beim Datenbankserver anzumelden, setzt der Logon-Trigger den Anmeldevorgang zurück.

Das Skript für diesen Trigger lautet wie folgt:

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

Im obigen Skript erstellen wir einen Trigger namens tr_CheckLogin. Der Triggerbereich ist auf server.

eingestellt

Sie können die Auslöserdetails anzeigen, indem Sie zu Objekt-Explorer -> Serverobjekte -> Auslöser gehen, wie in der folgenden Abbildung gezeigt:

Der Trigger wird immer dann ausgelöst, wenn das LOGON-Ereignis stattfindet, d. h. eine Verbindung versucht, sich beim Server anzumelden. Sehen Sie sich den Körper des Auslösers genau an.

Die Funktion ORIGINAL_LOGIN gibt den Namen des Benutzerprozesses oder der Verbindung zurück, die versucht, sich beim Server anzumelden. Als nächstes wird die Gesamtzahl der Verbindungen mit demselben Namen mithilfe der Ansicht sys.dm_exec_session gezählt. Wenn die Anzahl der Verbindungen größer als 3 ist, wird die Anmeldung rückgängig gemacht und eine Anweisung an den Benutzer ausgegeben, die lautet:„Mehr als drei Verbindungen nicht zulässig – Verbindung mit ‚Verbindungsname‘ fehlgeschlagen“.

Um dies zu überprüfen, öffnen Sie ein neues Abfragefenster im SQL Server Management Studio

Hinweis:Bisher sind zwei Verbindungen geöffnet, eine für SQL Server Management Studio und eine für das Abfragefenster.

Wenn Sie versuchen, ein neues Abfragefenster zu öffnen, wird der Trigger tr_CheckLogin ausgelöst, aber da die Gesamtzahl der Anmeldungen zu diesem Zeitpunkt drei beträgt, setzt der Trigger die Anmeldung nicht zurück.

Führen Sie die folgende Abfrage aus, um die Gesamtzahl der Verbindungen nach user_process zu überprüfen:

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

Jetzt gibt es insgesamt 3 Benutzerverbindungen, wie in der Ausgabe gezeigt:

Versuchen Sie nun erneut, eine neue Verbindung herzustellen, indem Sie ein neues Abfragefenster im SQL Server Management Studio öffnen.

Sie sehen folgenden Fehler:

Der Fehler besagt, dass die Anmeldung für „DESKTOP-GLQ5VRA\Mani“ (der Name meines PCs) aufgrund der Triggerausführung fehlgeschlagen ist. Grundsätzlich hat der von uns erstellte Trigger die Verbindung nicht zugelassen. Warten! Aber wo ist die Fehlermeldung, die wir gedruckt haben? Wir können es hier im obigen Meldungsfeld nicht sehen. Die benutzerdefinierte Fehlermeldung, die wir in den Trigger geschrieben haben, kann im Fehlerprotokoll angezeigt werden.

Um das Fehlerprotokoll anzuzeigen, führen Sie das folgende Skript aus:

EXECUTE sp_readerrorlog

Scrollen Sie im Fehlerprotokoll nach unten, bis Sie die benutzerdefinierte Nachricht finden, die Sie für den Anmeldeauslöser geschrieben haben. Der folgende Screenshot zeigt das Fehlerprotokoll meines Datenbankservers. Die benutzerdefinierte Nachricht ist im Fehlerprotokoll zu sehen:

Weiterführende Literatur:

  • YouTube:SQL Server-Anmeldeauslöser
  • Microsoft.com:Anmeldeauslöser
  • SQL-Studien:Flucht vor einem außer Kontrolle geratenen Logon-Trigger