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.

Deaktivieren eines Logon-Triggers

Ein Logon-Trigger kann erfolgreiche Verbindungen mit dem Database Engine (Datenbankmodul) effektiv für alle Benutzer verhindern, auch für Mitglieder der festen Serverrolle sysadmin. Wenn Verbindungen durch einen Logon-Trigger verhindert werden, können Mitglieder der festen Serverrolle sysadmin eine Verbindung herstellen, indem sie die dedizierte Administratorverbindung verwenden oder das Database Engine (Datenbankmodul) im minimalen Konfigurationsmodus (-f) starten. Weitere Informationen finden Sie unter Vorgehensweise: Verwenden der dedizierten Administratorverbindung zu SQL Server Management Studio und Verwenden der Startoptionen für den SQL Server-Dienst.

Erfassen von Ereignisdaten für Logon-Trigger

Wenn Sie XML-Daten zu LOGON-Ereignissen für die Verwendung in Logon-Triggern erfassen möchten, verwenden Sie die EVENTDATA-Funktion. Weitere Informationen finden Sie unter Entwerfen und Implementieren einer strukturierten Speicherung (Datenbankmodul). Mit dem LOGON-Ereignis wird das folgende Ereignisdatenschema zurückgegeben:

<EVENT_INSTANCE>

    <EventType>event_type</EventType>

    <PostTime>post_time</PostTime>

    <SPID>spid</SPID>

    <ServerName>server_name</ServerName>

<LoginName>login_name</LoginName>

<LoginType>login_type</LoginType>

<SID>sid</SID>

<ClientHost>client_host</ClientHost>

<IsPooled>is_pooled</IsPooled>

</EVENT_INSTANCE>

  • <EventType>
    Enthält LOGON.

  • <PostTime>
    Enthält die Uhrzeit, zu der eine Anforderung zum Erstellen einer Sitzung ausgegeben wird.

  • <SID>
    Enthält den base64-verschlüsselten binären Datenstrom der Sicherheits-ID (SID) für den angegebenen Anmeldenamen.

  • <ClientHost>
    Enthält den Hostnamen des Clients, von dem aus die Verbindung hergestellt wird. Der Wert lautet '&lt;local_machine&gt;', wenn der Name des Clients und des Servers identisch sind. Andernfalls entspricht der Wert der IP-Adresse des Clients.

  • <IsPooled>
    Lautet 1, wenn die Verbindung durch Verbindungspooling wiederverwendet wird. Andernfalls lautet der Wert 0.

Erstellen, Ändern und Löschen von Logon-Triggern

Logon-Trigger können anhand einer beliebigen Datenbank erstellt werden, sie werden jedoch auf der Serverebene registriert und befinden sich in der master-Datenbank.

So erstellen Sie einen Logon-Trigger

So ändern Sie einen Logon-Trigger

So löschen Sie einen Logon-Trigger

Abrufen von Informationen zu Logon-Triggern

Sie können Metadaten zu Logon-Triggern anzeigen, indem Sie die sys.server_triggers-Katalogsicht abfragen.