Wann wurde ein Tabellenauslöser deaktiviert und wieder aktiviert?

7

Ich muss wissen, ob der Aktivierungs- / Deaktivierungsverlauf eines Tabellentriggers von SQL Server nativ verfolgt wird.

Ich habe die Systemansichten überprüft:
• [sys]. [Trigger] enthält ein Feld "modify_date".
• [sys]. [Trigger_events] konzentriert sich auf die Trigger-Ereignisse INSERT / UPDATE / DELETE

Können Sie andere Informationsquellen zum Triggerverlauf empfehlen?

EngineeringSQL
quelle

Antworten:

10

SQL Server verfolgt diese Informationen nicht (ich habe halb erwartet, dass sie in der Standardablaufverfolgung angezeigt werden, aber sie sind auch nicht vorhanden). Durch Aktivieren / Deaktivieren wird "modify_date" aktualisiert, Sie können dies jedoch nicht von einer Umbenennung oder Codeänderung unterscheiden. Außerdem wird nur angezeigt, wann die letzte Änderung stattgefunden hat. Wenn Sie ein anderes Tracking wünschen (z. B. wer es getan hat), müssen Sie Auditing oder Trace implementieren. Ich dachte, vielleicht könnte auch ein DDL-Trigger verwendet werden, aber dies scheint eine absichtliche Funktionslücke zu sein:

http://connect.microsoft.com/SQLServer/feedback/details/509242/fire-a-ddl-trigger-when-the-new-syntax-disable-trigger-is-executed

https://connect.microsoft.com/SQLServer/feedback/details/434951/ddl-trigger-still-not-working-disable-trigger-is-this-not-an-event

So können Sie diese Informationen in Zukunft mithilfe eines Audits erfassen:

USE master;
GO

CREATE SERVER AUDIT MyAudit 
  TO FILE (FILEPATH = 'C:\temp\', MAXSIZE = 1 GB) 
  WITH (ON_FAILURE = CONTINUE); 
GO

ALTER SERVER AUDIT MyAudit WITH (STATE = ON); 
GO

USE [your_database];
GO

CREATE DATABASE AUDIT SPECIFICATION schema_db_change 
  FOR SERVER AUDIT MyAudit 
  ADD (SCHEMA_OBJECT_CHANGE_GROUP), 
  ADD (DATABASE_OBJECT_CHANGE_GROUP);

ALTER DATABASE AUDIT SPECIFICATION schema_db_change WITH (STATE = ON); 
GO

Deaktivieren Sie nun Ihren Auslöser und führen Sie Folgendes aus:

SELECT event_time, succeeded, server_principal_name, [object_name], [statement] 
FROM sys.fn_get_audit_file ('C:\Temp\MyAudit*', NULL, NULL);

Wenn Sie Audit aufgrund von Editionen oder anderen Problemen nicht verwenden können, können Sie dies relativ kostengünstig mithilfe einer serverseitigen Ablaufverfolgung durchführen. Einfach erfassen SQL:BatchCompletedund optional filtern TextData LIKE '%disable%trigger%'(Sie müssen testen, ob es in Ihrem Szenario besser ist, die Kosten für den Filter zu bezahlen, um zu vermeiden, dass zu viel gesammelt wird, oder einfach mehr sammeln und später reduzieren. Filter können recht teuer sein, hängen jedoch davon ab auf dem System.)

Ich bin sicher, dass es auch eine Möglichkeit gibt, dies mit erweiterten Veranstaltungen zu tun. Für XEvents und Audit ist jedoch 2008+ erforderlich, und Sie haben keine Version angegeben ...

Besser noch, entfernen Sie die Möglichkeit, Trigger für Benutzer zu ändern, die das Änderungsmanagement umgehen. Idealerweise verfügen Sie sollten der Lage sein , zu bestimmen , wer ohne jemals Blick auf die Datenbank einen Trigger aktiviert oder deaktiviert, weil niemand , dass es ohne zu dokumentieren tun sollte.

Aaron Bertrand
quelle
6

Derzeit unterstützen nur SQL Server Enterprise Edition und SQL Server Developer Edition die Überwachungsfunktion, um das Aktivieren und Deaktivieren von Triggern zu verfolgen. Um diese Ereignisse zu erfassen, müssen Sie zuerst eine Server-Überwachungsspezifikation erstellen. Das SQL Server-Überwachungsobjekt erfasst Server oder Datenbank. Level-Aktionen und Aktionsgruppen:

USE master;
GO
CREATE SERVER AUDIT ServerAudit
TO FILE (FILEPATH = 'c:\audits\', MAXSIZE = 2 GB)
WITH (ON_FAILURE = CONTINUE);
GO
ALTER SERVER AUDIT ServerAudit
WITH (STATE = ON);

Der nächste Schritt besteht darin, eine Datenbankprüfspezifikation auf Datenbankebene zu erstellen. Die Überwachungsgruppe, die wir in unserem Fall erfassen müssen, ist SCHEMA_OBJECT_CHANGE_GROUP. Es gibt keine Überwachungsgruppe, die ausschließlich Aktivierungs- / Deaktivierungsauslöserereignisse erfasst

USE [ACMEDB];
GO
CREATE DATABASE AUDIT SPECIFICATION schema_change
FOR SERVER AUDIT ServerAudit
ADD (SCHEMA_OBJECT_CHANGE_GROUP)
WITH (STATE = ON);
GO

Fragen Sie das zuvor erstellte Audit ab, indem Sie mit dem Operator LIKE erfasste Einträge auf diejenigen eingrenzen, die sich auf das Aktivieren / Deaktivieren von Triggern beziehen:

SELECT
       event_time AS [Time],
       server_principal_name AS [User],
       object_name AS [Object name],
       Statement
  FROM sys.fn_get_audit_file('c:\audits\ServerAudit*', NULL, NULL)
WHERE
       database_name
       =
       'ACMEDB'
   AND (
       Statement LIKE '%DISABLE%TRIGGER%'
    OR Statement LIKE '%ENABLE%TRIGGER%')ORDER BY
                                          [Time] DESC;

Die Ergebnisse zeigen, wer wann einen Trigger deaktiviert / aktiviert hat

Geben Sie hier die Bildbeschreibung ein Obwohl die von uns beschriebene Lösung nur für Benutzer von SQL Server Enterprise Edition und SQL Server Developer Edition gilt, ist eine SQL Server-Datenbankprüfung relativ einfach zu implementieren und kann bei der Verfolgung helfen, wenn Trigger deaktiviert / aktiviert sind

Die Überwachungsinformationen zum Aktivieren / Deaktivieren von Triggern können jedoch auch für die Vorgänge erfasst werden, die vor der Installation von "Überwachung" ausgeführt wurden . Weitere Informationen hierzu finden Sie im Online-Artikel So überprüfen Sie Ihre Überwachung - Nachverfolgung, wenn Trigger deaktiviert sind

Haftungsausschluss: Ich arbeite als Product Support Engineer bei ApexSQL

Ivan Stankovic
quelle
-1

Ein solcher Vorgang wird wahrscheinlich in der Standard-Verwaltungsablaufverfolgung aufgezeichnet . Der Link enthält Anweisungen zum Anzeigen.

Wenn es am Standardspeicherort gespeichert ist, können Sie Folgendes verwenden:

SELECT * 
FROM fn_trace_gettable
('C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\LOG\log.trc', default)
GO
Remus Rusanu
quelle
Es ist nicht in der Standardablaufverfolgung, nein.
Aaron Bertrand