Logon-Trigger

Logon-Trigger lösen gespeicherte Prozeduren als Antwort auf ein LOGON-Ereignis aus. Dieses Ereignis wird ausgelöst, wenn eine Benutzersitzung mit einer Instanz von SQL Servererstellt wird. Logon-Trigger werden ausgelöst, nachdem die Authentifizierungsphase der Anmeldung abgeschlossen ist und bevor die Benutzersitzung erstellt wird. Aus diesem Grund werden alle Meldungen, die aus dem Trigger stammen und normalerweise den Benutzer erreichen (z. B. Fehlermeldungen und Meldungen aus der PRINT-Anweisung) zum SQL Server -Fehlerprotokoll umgeleitet. Logon-Trigger werden nicht ausgelöst, wenn die Authentifizierung nicht ausgeführt werden kann.

Sie können Logon-Trigger zum Überwachen und Steuern von Serversitzungen verwenden, beispielsweise durch Nachverfolgung der Anmeldeaktivität, Einschränkung von Anmeldungen auf SQL Serveroder durch Einschränkung der Anzahl der Sitzungen für einen bestimmten Anmeldenamen. Beispielsweise werden im folgenden Code durch den Logon-Trigger Anmeldeversuche für SQL Server abgelehnt, die mit dem Anmeldenamen login_test initiiert werden, wenn mit diesem Anmeldenamen bereits drei Benutzersitzungen erstellt wurden.

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;

Beachten Sie, dass das LOGON-Ereignis dem AUDIT_LOGIN SQL-Ablaufverfolgungsereignis entspricht, das in Ereignisbenachrichtigungenverwendet werden kann. Der Hauptunterschied zwischen Triggern und Ereignisbenachrichtigungen besteht darin, dass Trigger synchron mit Ereignissen ausgelöst werden und Ereignisbenachrichtigungen sich asynchron verhalten. Dies bedeutet beispielsweise, dass Sie einen Logon-Trigger verwenden müssen, wenn Sie das Erstellen einer Sitzung abbrechen möchten. Eine Ereignisbenachrichtigung für ein AUDIT_LOGIN-Ereignis kann nicht für diesen Zweck verwendet werden.

Angeben des ersten und des letzten Triggers

Für das LOGON-Ereignis können mehrere Trigger definiert werden. Jeder dieser Trigger kann als zuerst oder zuletzt für ein Ereignis ausgelöster Trigger festgelegt werden. Hierfür wird die gespeicherte Systemprozedur sp_settriggerorder verwendet. SQL Server gibt es keine Garantie für die Ausführungsreihenfolge der restlichen Trigger.

Verwalten von Transaktionen

Bevor in SQL Server ein Logon-Trigger ausgelöst wird, wird in SQL Server eine implizite Transaktion erstellt, die von keiner Benutzertransaktion abhängig ist. Aus diesem Grund lautet die Transaktionsanzahl 1, wenn der erste Logon-Trigger ausgelöst wird. Nachdem alle Logon-Trigger ausgeführt wurden, wird ein Commit für die Transaktion ausgeführt. In SQL Server wird wie bei anderen Arten von Triggern auch ein Fehler zurückgegeben, wenn die Ausführung eines Logon-Triggers mit der Transaktionsanzahl 0 abgeschlossen wird. Mit der ROLLBACK TRANSACTION-Anweisung wird die Transaktionsanzahl auch dann auf 0 zurückgesetzt, wenn die Anweisung in einer geschachtelten Transaktion ausgegeben wird. Mit COMMIT TRANSACTION kann die Transaktionsanzahl auf 0 verringert werden. Aus diesem Grund empfiehlt es sich nicht, COMMIT TRANSACTION-Anweisungen in Logon-Triggern auszugeben.

Bedenken Sie folgende Punkte, wenn Sie eine ROLLBACK TRANSACTION-Anweisung in Logon-Triggern verwenden:

  • Für alle Datenänderungen, die bis zum Zeitpunkt von ROLLBACK TRANSACTION vorgenommen werden, wird ein Rollback ausgeführt. Zu diesen Änderungen zählen die durch den aktuellen Trigger vorgenommenen Änderungen sowie die durch vorherige Trigger erfolgten Änderungen, die für das gleiche Ereignis ausgeführt wurden. Die restlichen Trigger für dieses bestimmte Ereignis werden nicht ausgeführt.

  • Durch den aktuellen Trigger werden weiterhin alle restlichen Anweisungen ausgeführt, die nach der ROLLBACK-Anweisung auftreten. Wenn durch eine dieser Anweisungen Daten geändert werden, wird für die Änderungen kein Rollback ausgeführt.

Es wird keine Benutzersitzung erstellt, wenn eine der folgenden Bedingungen während der Ausführung eines Triggers für ein LOGON-Ereignis auftritt:

  • Für die ursprüngliche implizite Transaktion treten Rollbacks oder Fehler auf.

  • Ein Fehler mit einem Schweregrad über 20 wird im Triggertext ausgelöst.

Deaktivieren eines Logon-Triggers

Ein Anmeldetrigger kann erfolgreiche Verbindungen mit der Datenbank-Engine für alle Benutzer, einschließlich der Mitglieder der sysadmin festen Serverrolle, effektiv verhindern. Wenn ein Anmeldetrigger Verbindungen verhindert, können Mitglieder der sysadmin festen Serverrolle eine Verbindung herstellen, indem sie die dedizierte Administratorverbindung verwenden oder die Datenbank-Engine im minimalen Konfigurationsmodus (-f) starten. Weitere Informationen finden Sie unter Startoptionen für den Datenbank-Engine-Dienst.

Aufgabe Thema
Beschreibt, wie Logon-Trigger erstellt werden. Logon-Trigger können anhand einer beliebigen Datenbank erstellt werden, sie werden jedoch auf der Serverebene registriert und befinden sich in der master -Datenbank. CREATE TRIGGER (Transact-SQL)
Beschreibt, wie Logon-Trigger geändert werden. ALTER TRIGGER (Transact-SQL)
Beschreibt, wie Logon-Trigger gelöscht werden. DROP TRIGGER (Transact-SQL)
Beschreibt, wie Informationen zu Logon-Triggern zurückgegeben werden. sys.server_triggers (Transact-SQL)

sys.server_trigger_events (Transact-SQL)
Beschreibt, wie Ereignisdaten zu Logon-Triggern aufgezeichnet werden.

Weitere Informationen

DDL-Trigger