web-dev-qa-db-fra.com

Quand une gâchette de table était-elle désactivée et réactivée?

J'ai besoin de savoir si l'historique activer/désactiver l'historique d'un déclencheur de table est traqué de manière native par SQL Server.

J'ai examiné les vues du système:
[.____] • [SYS]. [Déclencheurs] contient un champ modify_date
[.____] • [SYS]. [TRGGER_EVENT] se concentre sur les événements d'insertion/mise à jour de la gâchette/Supprimer

Pouvez-vous recommander toute autre source d'informations sur l'historique des déclencheurs?

7
EngineeringSQL

SQL Server ne suit pas ces informations (je suis à moitié prévu de le voir dans la trace par défaut, mais ce n'est pas là non plus). Activer/Désactivera Mettre à jour Modify_Date, mais vous ne pourrez pas distinguer cela à partir d'une modification de renommée ou de code. En outre, il ne vous montrera que lorsque le dernier a eu lieu. Si vous voulez tout autre suivi (comme qui l'a fait), vous devrez mettre en œuvre l'audit ou la trace. Je pensais peut-être qu'un déclencheur DDL pourrait également être utilisé, mais cela semble être un écart de fonctionnalité intentionnel:

http://connect.microsoft.com/sqlserver/feedback/details/509242/fire-a-dl-trigger-Quand-Le-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

Voici comment vous pouvez capturer ces informations à l'avenir à l'aide d'un audit:

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

Maintenant, allez désactiver votre déclencheur, puis exécutez:

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

Si vous ne pouvez pas utiliser l'audit en raison de l'édition ou d'autres problèmes, vous pouvez le faire relativement peu coûteux à l'aide d'une trace côté serveur. Juste capturer SQL:BatchCompleted et filtrer éventuellement sur TextData LIKE '%disable%trigger%' (Vous devrez tester si c'est mieux dans votre scénario de payer le coût du filtre pour éviter de trop collecter trop, ou de collecter plus et de les emporter plus tard. Les filtres peuvent être assez chers, mais cela dépend du système. )

Je suis sûr qu'il y a aussi un moyen de le faire avec des événements prolongés. Mais les Xevents et les audits ont à la fois besoin de 2008+ et vous n'avez pas spécifié la version ...

Mieux encore, supprimez la possibilité de modifier les déclencheurs pour les utilisateurs qui contournent la gestion du changement. Idéalement, vous devrait être capable de déterminer qui activé ou désactivé un déclencheur sans jamais regarder la base de données, car personne ne devrait le faire sans le documenter.

10
Aaron Bertrand

Actuellement, seule SQL Server Enterprise Edition et SQL Server Developer Edition prennent en charge la fonction d'audit afin de suivre l'activation et la désactivation des déclencheurs de capturer ces événements, vous devez créer d'abord une spécification d'audit de serveur - l'objet d'audit SQL Server collecte le serveur ou la base de données. Niveau Actions et groupes d'Actions:

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);

La prochaine étape consiste à créer une spécification d'audit de base de données au niveau de la base de données. Le groupe d'audit que nous devons capturer dans notre cas est Schema_Object_Change_group - il n'y a pas de groupe d'audit qui capture exclusivement Activer/désactiver les événements de déclenchement

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

Requête l'audit créé précédemment, en utilisant l'opérateur similaire pour réduire les entrées capturées à celles liées à Activer/Désactiver les déclencheurs:

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;

Les résultats montreront qui handicapés/activé un déclencheur et quand

enter image description here Bien que la solution que nous avons décrite soit applicable pour SQL Server Enterprise Edition et SQL Server Developer Edition uniquement, un audit de base de données SQL Server est assez simple à implémenter et peut vous aider à suivre lorsque des déclencheurs sont désactivés/activés.

Toutefois, les informations d'audit sur activer/désactiver des déclencheurs peuvent être capturées même pour les opérations exécutées avant l'installation de "audit" . Vous pouvez en savoir plus à ce sujet dans la section Comment auditer votre audit - suivi lorsque des déclencheurs sont désactivés Article en ligne

Disclaimer: Je travaille comme ingénieur de support de produit à apexsql

6
Ivan Stankovic