J'ai récemment vécu la situation suivante : dans une base de données SQL Server, une table possédait un trigger qui était déclenché lorsque des données étaient manipulées. Entre autre (pour garder l'exemple simple), la date de dernière modification était automatiquement mise à jour lors des énoncés UPDATE.
Lors d'une maintenance, comme j'avais une série de manipulations à faire dont l'ajout et l'initialisation d'un nouveau champ selon des données compilées du système, le trigger se serait déclenché automatiquement pour chaque enregistrement, ce qui aurait écrasé inutilement les dates de dernières mises à jour ainsi que de provoquer une augmentation considérable dans le temps d'exécution (1 fois pour chaque rangée de la table).
Pour contourner le problème et minimiser le down time, j'ai tout simplement placé le système en mode maintenance et désactivé temporairement les triggers, le temps d'effectuer ma série de commandes. Une fois complétée, je les ai réactivés. L'avantage de cette technique est que les triggers existent toujours dans le système mais que ses règles ne sont pas appliquées. Ça nous évite surtout de devoir les supprimer pour ensuite les créer à nouveau.
Avec SQL Server, on peut désactiver un trigger en spécifiant le nom de la table et le nom du trigger, ou en utilisant le mot clé "ALL" pour désactiver tous ceux associés à la table.
-- ActivationDepuis SQL Server 2005, on peut aussi utiliser la syntaxe suivante :
ALTER TABLE tablename DISABLE TRIGGER triggername;
ALTER TABLE tablename DISABLE TRIGGER ALL;
-- Réactivation
ALTER TABLE tablename ENABLE TRIGGER triggername;
ALTER TABLE tablename ENABLE TRIGGER ALL;
DISABLE TRIGGER triggername ON tablename;En quelques secondes, la maintenance était terminée. Ma suggestion : mémorisez la premiere syntaxe puisqu'elle est plus répandue dans les différents types de RDBMS (Relational database management system) alors que DISABLE TRIGGER est une approche non standard de Microsoft.
DISABLE TRIGGER ALL ON tablename;
-- et inversement
ENABLE TRIGGER triggername ON tablename;
ENABLE TRIGGER ALL ON tablename;