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.
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.
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 ‘’)
1 Create Trigger MaxSessions 2 ON ALL SERVER WITH EXECUTE AS 'FBIAdministrator' 3 FOR LOGON 4 AS 5 BEGIN 6 If ((select count(*) from sys.dm_exec_connections 7 ALTER TRIGGER trgMaxSessions 8 where session_id>50) > 30 9 AND 10 (ORIGINAL_LOGIN() != 'FBIAdministrator')) 11 ROLLBACK; 12 END;
1 ALTER TRIGGER trgMaxSessions 2 ON ALL SERVER WITH EXECUTE AS 'FBIAdministrator' 3 FOR LOGON 4 AS 5 BEGIN 6 If ((select count(*) from sys.dm_exec_sessions where original_login_name= ORIGINAL_LOGIN()) > 3 7 AND 8 (ORIGINAL_LOGIN() != 'FBIAdministrator')) 9 ROLLBACK; 10 END;
1 create TRIGGER BusinessTime 2 ON ALL SERVER WITH EXECUTE AS 'FBIAdministrator' 3 FOR LOGON 4 AS 5 BEGIN 6 IF (substring(convert(varchar(50),Current_timestamp),12,23)) 7 not between ' 06:00PM' and ' 06:00AM' 8 AND 9 (app_name() like '%Report%') 10 ROLLBACK; 11 END;
1 Create TRIGGER LoginMonitor 2 ON ALL SERVER WITH EXECUTE AS 'FBIAdministrator' 3 FOR LOGON 4 AS 5 BEGIN 6 INSERT INTO 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 CREATE TABLE [dbo].[LoginInfos]( 14 [id] [int] IDENTITY(1,1) NOT NULL, 15 [Orgname] [varchar](50) NULL, 16 [Datum] [datetime] NULL, 17 [Info] [varchar](100) NULL 18 ) 19
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!
In SQL Server 2016 wurde das sog. dynamic data masking eingeführt. Eine Möglichkeit Daten bei…
Seit Sharepoint Server 2007 präsentiert sich die Installation immer auf die gleiche Weise. Gerade mal,…
Es weihnachtet! Gerade bekam ich von einer Kollegin Plätzchen angeboten mit der Größe eines Diskus…
Nein, bitte nicht verwechseln: temporal tables haben nichts zu tun mit temporary tables table variables…
SQL Server 2016.. habe ich schon erwähnt, dass ich den ziemlich cool finde? Wollen wir…
Nach langer Zeit wieder mal eine Artikel von mir.. der mich besonders erfreut. SQL Server…