Logon-Trigger

Gilt für:SQL ServerAzure SQL Managed Instance

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 eingerichtet wird. Logon-Trigger werden ausgelöst, nachdem die Authentifizierungsphase der Anmeldung abgeschlossen ist und bevor die Benutzersitzung erstellt wird. Daher werden alle Nachrichten, die innerhalb des Triggers stammen, die in der Regel den Benutzer erreichen, z. B. Fehlermeldungen und Nachrichten aus der PRINT-Anweisung, in das SQL Server-Fehlerprotokoll umgeleitet. Logon-Trigger werden nicht ausgelöst, wenn die Authentifizierung nicht ausgeführt werden kann.

Sie können Anmeldetrigger verwenden, um Serversitzungen zu überwachen und zu steuern, z. B. durch Nachverfolgen von Anmeldeaktivitäten, Einschränken von Anmeldungen auf SQL Server oder Einschränken der Anzahl von Sitzungen für eine bestimmte Anmeldung. Im folgenden Code wird beispielsweise durch den Anmeldeauslöser die Anmeldeversuche an SQL Server verweigert, die durch die Anmeldung initiiert werden, login_test wenn bereits drei Benutzersitzungen vorhanden sind, die von dieser Anmeldung erstellt wurden.

USE master;  
GO  
CREATE LOGIN login_test WITH PASSWORD = N'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 N'login_test'  
FOR LOGON  
AS  
BEGIN  
IF ORIGINAL_LOGIN()= N'login_test' AND  
    (SELECT COUNT(*) FROM sys.dm_exec_sessions  
            WHERE is_user_process = 1 AND  
                original_login_name = N'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 garantiert nicht die Ausführungsreihenfolge der verbleibenden Trigger.

Verwalten von Transaktionen

Bevor SQL Server einen Anmeldetrigger auslöst, erstellt SQL Server eine implizite Transaktion, die von jeder Benutzertransaktion unabhä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. Wie bei anderen Arten von Triggern gibt SQL Server einen Fehler zurück, wenn ein Anmeldetrigger die Ausführung mit einer Transaktionsanzahl von 0 beendet. 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 Datenbank-Engine 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 Datenbank-Engine s im minimalen Konfigurationsmodus (-f). 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