Trigger sind seitens Performance vermutlich die schlechteste Wahl. Worüber wir allerdings hier sprechen hat nichts mit den üblichen Insert, Update und Delete Trigger zu tun. Wir wollen aktive Login Versuche überwachen und evtl darauf reagieren.
Das einzig Gemeinsame mit den Üblichen DML Triggern ist also das Reagieren auf Ereignisse – den Logins.
Ein Frage der Zeit
Wissenswert ist hier, dass Logon Trigger erst nach der Authentifizierung stattfinden, aber bevor eine Benutzersitzung zugewiesen wird. Daher werden auch alle Fehlermeldung, die evtl durch den Trigger ausgelöst werden in das SQL Server Fehlerprotokoll geschrieben Ist das Login grundsätzlich falsch (falsches Kennwort oder ähnliches), dann wird der Logon Trigger gar nicht erst ausgelöst.
Zweckdienliche Hinweise erbeten
Insofern läßt sich der Zweck der Logon Trigger gut vorstellen. So könnte man beispielsweise die Uhrzeiten abfragen und je nachdem eine Login zulassen oder eben auch das Login verwerfen (Rollback). Oder etwa pro User maximal 3 Sessions oder grundsätzlich eine maximale Anzahl an Sessions generell zulassen. Der Phantasie sind hier keine Grenzen gesetzt.
Beachte allerdings hierbei, dass der Trigger im Namen des User ausgeführt wird. Insofern muss, falls die Anzahl der Sessions ausgelesen werden sollte, das Recht für View State für den User vorhanden sein oder alternativ läßt man den Trigger unter einem bestimmten Useraccount ausführen. (execute as ‘’)
Maximal 30 Session, außer für den Administrator
1: CreateTrigger MaxSessions2: ONALL SERVER WITHEXECUTEAS 'FBI\Administrator'3: FOR LOGON4: AS5: BEGIN6: If ((selectcount(*) from sys.dm_exec_connections7: ALTERTRIGGER trgMaxSessions8: where session_id>50) > 309: AND10: (ORIGINAL_LOGIN() != 'FBI\Administrator'))
11: ROLLBACK;12: END;13:
Nur 3 Sessions pro User , außer für den Administrator
1: ALTERTRIGGER trgMaxSessions2: ONALL SERVER WITHEXECUTEAS 'FBI\Administrator'3: FOR LOGON4: AS5: BEGIN6: If ((selectcount(*) from sys.dm_exec_sessions where original_login_name= ORIGINAL_LOGIN()) > 37: AND8: (ORIGINAL_LOGIN() != 'FBI\Administrator'))
9: ROLLBACK;10: END;
Für bestimmte Anwendungen Zeiten vorgeben
1: createTRIGGER BusinessTime2: ONALL SERVER WITHEXECUTEAS 'FBI\Administrator'3: FOR LOGON4: AS5: BEGIN6: IF (substring(convert(varchar(50),Current_timestamp),12,23))
notbetween ' 06:00PM' and ' 06:00AM'7: AND8: (app_name() like '%Report%')9: ROLLBACK;10: END;
Protokollierung der Logins
1: CreateTRIGGER LoginMonitor2: ONALL SERVER WITHEXECUTEAS 'FBI\Administrator'3: FOR LOGON4: AS5: BEGIN6: INSERTINTO DWMontor..Logininfos (Orgname, Datum, Info)7: SELECT ORIGINAL_LOGIN(), GETDATE(),8: EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]','NVARCHAR(128)')9: END;10:11: --Tabelle für Loginprotokollierung
12:13: CREATETABLE [dbo].[LoginInfos](14: [id] [int] IDENTITY(1,1) NOTNULL,15: [Orgname] [varchar](50) NULL,16: [Datum] [datetime] NULL,17: [Info] [varchar](100) NULL18: )
Wie bereits gesagt. Der Fantasie sind keine grenzen gesetzt, ob noch eine Emailbenachrichtigung zusenden lassen oder was auch immer. Aüßerst praktisch!
Viel Spaß damit!