2009-08-03 2 views
1

Wird bei meinem Anmelde-Trigger ein Leistungsproblem festgestellt?Wird bei meinem Anmelde-Trigger ein Leistungsproblem festgestellt?

Ich versuche, den Overhead zu reduzieren und Leistungsprobleme zu verhindern, bevor ich diesen Auslöser auf meine Produktion SQL Server drücken.

Ich habe derzeit die Anmeldung Trigger auf meinem SQL Server Entwicklung. Ich habe es über das letzte Wochenende laufen lassen und es hat mehr als 50.000 Zeilen in meine Audit-Log-Tabelle geschrieben. Ich habe festgestellt, dass 95% der Datensätze für die Anmeldung "NT AUTHORITY/SYSTEM" waren. Also habe ich beschlossen, alles mit 'NT AUTHORITY%' zu filtern und diese Datensätze einfach nicht einzufügen. Ich denke, wenn ich diese "NT-AUTHORITY" -Aufzeichnungen filtere, dass die Menge der Ressourcen, die ich für diese Einsätze einspare, die Kosten der IF-Statement-Prüfung wettmachen wird. Ich habe auch Prefmon angeschaut und sehe nichts ungewöhnliches während der Trigger aktiviert ist, aber dann sieht mein Entwicklungsserver nicht die gleiche Menge an Aktivität wie die Produktion.

USE [MASTER] 
GO 

CREATE TRIGGER AuditServerAuthentication 
ON ALL SERVER 
WITH EXECUTE AS SELF 
FOR LOGON 
AS BEGIN 

DECLARE @event XML, @Logon_Name VARCHAR(100) 
SET @Event = EVENTDATA() 
SET @Logon_Name = CAST(@event.query('/EVENT_INSTANCE/LoginName/text()') AS VARCHAR(100)) 

IF @Logon_Name NOT LIKE 'NT AUTHORITY%' 
BEGIN 
    INSERT INTO Auditing.Audit.Authentication_Log 
     (Post_Time,Event_Type,Login_Name,Client_Host,Application_Name,Event_Data) 
    VALUES 
     (
      CAST(CAST(@event.query('/EVENT_INSTANCE/PostTime/text()') AS VARCHAR(64)) AS DATETIME), 
      CAST(@event.query('/EVENT_INSTANCE/EventType/text()') AS VARCHAR(100)), 
      CAST(@event.query('/EVENT_INSTANCE/LoginName/text()') AS VARCHAR(100)), 
      CAST(@event.query('/EVENT_INSTANCE/ClientHost/text()') AS VARCHAR(100)), 
      APP_NAME(), 
      @Event 
     ) 
END 
END 
GO 

Antwort

1

Ich benutze einen sehr ähnlichen Auslöser in meinem Server, und ich habe keine Leistungsprobleme. Die Produktionsdatenbank erhält ca. 10 Logins pro Sekunde. Dies erzeugt eine große Menge an Daten im Laufe der Zeit, was zu größeren Backups, etc.

Für einige Server erstellt ich eine Tabelle mit den Benutzern, dass Logins nicht protokolliert werden sollten, mit diesem ist es auch möglich, Anmeldungen entsprechend zu verweigern Stunden

Der Unterschied zu meinem Trigger ist, dass ich eine Datenbank für Auditing-Zwecke erstellt habe, in dem ich einige gespeicherte Prozeduren erstellte, die ich im Trigger aufrufen. Der Trigger sieht so aus:

alter TRIGGER [tr_AU_LogonLog] ON ALL SERVER 
WITH EXECUTE AS 'AUDITUSER' 
FOR LOGON 
AS 
BEGIN 
    DECLARE 
     @data XML 
     , @rc INT 
    SET @data = EVENTDATA() 
    EXEC @rc = AuditDB.dbo.LogonLog @data 
END ; 

Die Produktions-DB erhält etwa 10 Logins pro Sekunde. Dies erzeugt eine große Menge an Daten im Laufe der Zeit, was zu größeren Backups, etc.

EDIT: oh ich vergaß, es empfohlen, wenn Sie einen bestimmten Benutzer für den Trigger erstellen, ausführen als selbst kann in einigen Szenarien gefährlich sein.

EDIT2: Es gibt einige nützliche Informationen über die Ausführung als Anweisung here. oh und sei vorsichtig beim Implementieren von Triggern, kannst du dich versehentlich aussperren, ich empfehle, eine Verbindung nur für den Fall offen zu halten :)

0

Es ist nicht wie eine kostspielig mir überhaupt IF-Anweisung sieht (es aus der Datenbank alle sind die Auswahl ist nicht, wie) und, wie Sie sagen, würde ein INSERT weit weniger kostspielig als durchführen, die sind ist in 95% der Zeit nicht notwendig. Allerdings sollte ich hinzufügen, ich bin nur ein Datenbank-Programmierer und kein DBA, also bin offen dafür, hier korrigiert zu werden.

Ich bin, obwohl, etwas neugierig auf Warum Sie tun dies? Hat SQL Server nicht bereits a built-in mechanism for Login Auditing, die Sie verwenden können?

+0

Der "eingebaute Mechanismus für Login Auditing" ist nicht einfach zu sortieren und nicht Stellen Sie alle Informationen bereit, mit denen Sie benutzerdefinierte Berichte erstellen können. DBAs mögen es, aus Tabellen auszuwählen, um unsere Antworten zu erhalten. :) – DBAndrew

0

Es gibt nichts sofort offensichtlich. Es ist effektiv ein IF, der einen INSERT schützt. Das einzige, was ich validieren würde, ist, wie teuer das XML-Parsing ist - ich habe es noch nicht in SQL Server verwendet, also ist es mir unbekannt.

Zwar wäre es seltsam erscheinen, für Microsoft eine einfache Möglichkeit zu liefern Metadaten zu bekommen (EVENTDATA()) noch es teuer machen zu analysieren, noch seltsamere Dinge passierten ...