Freigeben über


Anmeldetrigger

Die Anmeldung löst gespeicherte Prozeduren als Reaktion auf ein LOGON-Ereignis aus. Dieses Ereignis wird ausgelöst, wenn eine Benutzersitzung mit einer Instanz von SQL Server eingerichtet wird. Die Anmeldeauslöser werden nach Abschluss der Authentifizierungsphase der Anmeldung aktiviert, aber bevor die Benutzersitzung tatsächlich etabliert 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. Anmeldetrigger werden nicht ausgelöst, wenn die Authentifizierung fehlschlägt.

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 = '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, während Ereignisbenachrichtigungen asynchron sind. Dies bedeutet beispielsweise, dass Sie einen Anmeldetrigger verwenden müssen, wenn Sie verhindern möchten, dass eine Sitzung eingerichtet wird. Eine Ereignisbenachrichtigung für ein AUDIT_LOGIN-Ereignis kann zu diesem Zweck nicht verwendet werden.

Angeben des ersten und letzten Triggers

Mehrere Trigger können für das LOGON-Ereignis definiert werden. Mithilfe der Systemprozedur sp_settriggerorder kann einer dieser Trigger als erster oder letzter Trigger festgelegt werden, der bei einem Ereignis ausgelöst werden soll. 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. Wenn der erste Anmeldetrigger ausgelöst wird, lautet die Transaktionsanzahl daher 1. Nachdem alle Anmeldeauslöser die Ausführung abgeschlossen haben, wird die Transaktion abgeschlossen. 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. Die ROLLBACK TRANSACTION-Anweisung setzt die Transaktionsanzahl auf 0 zurück, auch wenn die Anweisung in einer geschachtelten Transaktion ausgegeben wird. COMMIT TRANSACTION kann die Transaktionsanzahl auf 0 erhöhen. Daher raten wir davon ab, COMMIT TRANSACTION-Anweisungen innerhalb von Anmeldetriggern auszuführen.

Beachten Sie Folgendes, wenn Sie eine ROLLBACK TRANSACTION-Anweisung in Anmeldetriggern verwenden:

  • Alle Datenänderungen, die zum Zeitpunkt von ROLLBACK TRANSACTION vorgenommen wurden, werden zurückgesetzt. Diese Änderungen umfassen diejenigen, die vom aktuellen Auslöser vorgenommen wurden, und diejenigen, die von vorherigen Auslösern vorgenommen wurden, die für dasselbe Ereignis ausgeführt wurden. Alle verbleibenden Trigger für das bestimmte Ereignis werden nicht ausgeführt.

  • Der aktuelle Trigger führt weiterhin alle verbleibenden Anweisungen aus, die nach dem ROLLBACK-Befehl erscheinen. Wenn eine dieser Anweisungen Daten ändert, werden die Änderungen nicht zurückgesetzt.

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

  • Die ursprüngliche implizite Transaktion wird zurückgesetzt oder schlägt fehl.

  • Ein Fehler, der einen Schweregrad von mehr als 20 aufweist, wird innerhalb des Triggerkörpers ausgelöst.

Deaktivieren eines Anmeldetriggers

Ein Anmeldetrigger kann erfolgreiche Verbindungen mit dem Datenbankmodul für alle Benutzer, einschließlich Mitgliedern der sysadmin festen Serverrolle, effektiv verhindern. Wenn ein Anmeldetrigger Verbindungen verhindert, können Mitglieder der festen Serverrolle mithilfe der sysadmin dedizierten Administratorverbindung eine Verbindung herstellen oder das Datenbankmodul im minimalen Konfigurationsmodus (-f) starten. Weitere Informationen finden Sie unter Startoptionen des Datenbankmoduldiensts.

Aufgabe Thema
Beschreibt, wie Anmeldetrigger erstellt werden. Anmeldetrigger können aus einer beliebigen Datenbank erstellt werden, sind aber auf Serverebene registriert und befinden sich in der Masterdatenbank . CREATE TRIGGER (Transact-SQL)
Beschreibt, wie Anmeldetrigger geändert werden. ALTER TRIGGER (Transact-SQL)
Beschreibt, wie Anmeldetrigger gelöscht werden. DROP TRIGGER (Transact-SQL)
Beschreibt, wie Informationen zu Anmeldetriggern zurückgegeben werden. sys.server_triggers (Transact-SQL)

sys.server_trigger_events (Transact-SQL)
Beschreibt, wie Anmeldetriggerereignisdaten erfasst werden.

Siehe auch

DDL-Trigger