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 Server erstellt 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 Server oder 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 Ereignisbenachrichtigungen verwendet 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. In 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 Logon-Trigger kann effektiv erfolgreiche Verbindungen zu Database Engine (Datenbankmodul) für alle Benutzer verhindern, einschließlich Elementen der festen Serverrolle sysadmin. Wenn ein LOGON-Trigger Verbindungen verhindert, können die Mitglieder der festen Serverrolle sysadmin über die dedizierte Administratorverbindung eine Verbindung herstellen oder durch Starten des Database Engine (Datenbankmodul)s im minimalen Konfigurationsmodus (-f). Weitere Informationen finden Sie unter Startoptionen für den Datenbankmoduldienst.

Verwandte Aufgaben

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.

Siehe auch

Konzepte

DDL-Trigger