Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1901 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  activer/desactiver des trigger dynamiquement

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

activer/desactiver des trigger dynamiquement

n°1409305
fifiz
Posté le 19-07-2006 à 11:43:18  profilanswer
 

Bonjour,
 
Dans le cadre d'un projet dans ma boite on va mettre en place des tables de journaling pour pouvoir monitorer les mises à jour effectuées sur une BD pendant l'exectution d'un ou plusieurs traitements.
 
En ayant un modèle de donnée de la forme :  
 
   Table1  
   Clef  Champ11  
   Data  Champ12  
 
Apres déclaration de la table suivante :  
 
   Journal_Table1  
   Clef  Type_maj
 Champ11  
   Data  Champ12  
 
Avec Type_maj qui serait un champ alimenté avec 'D' pour delete, 'U' pour update et 'I' pour Insert.
 
A l'aide de trigger on va faire les opérations suivantes :  
 
 - En cas d'insert dans Table1 :  
     de faire un select dans Journal_Table1 avec Type_maj = 'D' et d'y supprimer l'instance si elle est trouvée et de faire un insert des même données dans Journal_table1 avec Type_maj = 'U'  
       sinon de faire un insert dans Journal_Table1 avec Type_maj = 'I'  
 
 - En cas d'update sur une instance de Table1 :  
     de faire un select dans Journal_Table1 avec Type_maj = 'I' et d'y updater l'instance si elle est trouvée,  
       sinon, de faire un select dans Journal_table1 avec Type_maj = 'U' d'y updater l'instance si elle est trouvée,  
       sinon, d'inserer l'instance updaté dans Journal_table1 avec Type_maj = 'U'.  
 
 - En cas de delete sur Table1 :  
     de faire un select sur Journal_Table1 avec Type_maj = 'I' et d’y détruire l’instance si elle est trouvée  
       sinon de faire un select sur Journal_Table1 avec Type_maj = 'U' et d’y détruire l’instance si elle est trouvée en l'inserant dans Journal_Table1 avec Type_maj = 'D'  
       sinon de faire un insert de l’instance supprimée dans Journal_Table1 avec Type_maj = 'D'  
 
A la fin on devrait donc être en mesure de matérialiser :  
 - les instances qui n'existaient pas et qui existent maintenant,  
 - les instance qui existent maintenant et qui n'existaient pas,  
 - les instances qui ont été modifiées.  
 
Par contre, on va devoir faire aussi des tests de performance et ces tables de journaling risquent de fausser les résultats.
 
J'ai donc besoin de pouvoir désactiver ces trigger de manière assez souple.
 
ex : si je fait un test fonctionnel je lance mes traitement après avoir activé les triggers sinon, si je suis sur un test de perf, je lance mes traitements après les avoir désactivés.
 
Je pourrais conditionner l'exectution des trigger par la présence d'une instance dans  une table spécifique du SGBD mais je crains que cela ne soit pas neutre sur la rapidité du traitement.
 
Est-ce que vous voyez une autre solution qui serait totalement neutre (ou vraiment non-significative) ?
 
Merci d'avance.
 
A+

mood
Publicité
Posté le 19-07-2006 à 11:43:18  profilanswer
 

n°1409569
moonboot
Posté le 19-07-2006 à 16:21:50  profilanswer
 

pourquoi ne pas plutôt travailler sur les logs de la base ? a mon avis ce sera bcp plus simple

n°1409622
fifiz
Posté le 19-07-2006 à 17:17:25  profilanswer
 

Pour 10000 raisons mais c'est pas la question =)

n°1410035
moonboot
Posté le 20-07-2006 à 11:13:30  profilanswer
 

si tu veux qu'on t'aide, il faut aussi qu'on comprenne ton besoin réel.
 
moi ya un truc que je comprends pas : si tu veux absolument utiliser des triggers c'est que tu veux l'histo complète des màj de tes tables.
et dans ce cas là les triggers font partie entière de ton appli et doivent donc rentrer dans tes tests de perf.
 
si tu veux juste des stats de màj de table alors là je vois pas d'utilité aux triggers

n°1410590
fifiz
Posté le 20-07-2006 à 19:28:41  profilanswer
 

Oui et non car les trigger serait activés uniquement en interne dans le cadre de tests fonctionnel et ne seraient jamais déployés sur des base de prod client donc c'est exclus de mes tests de perf.
 

n°1410611
MagicBuzz
Posté le 20-07-2006 à 20:19:11  profilanswer
 

1/ c'est quoi ton SGBD ?
2/ SQL Server 2005 :


DISABLE TRIGGER { [ schema . ] trigger_name [ ,...n ] | ALL }
ON { object_name | DATABASE | ALL SERVER } [ ; ]


3/ Ca doit être vaguement la même syntaxe sur tous les autres SGBD (peut-être avec un ALTER)

n°1410875
fifiz
Posté le 21-07-2006 à 10:27:41  profilanswer
 

Merci de ton conseil.
 
Il y a un point que je n'avais pas précisé c'est qu'il y a 350 tables dans le MdD et donc je me vois mal lancer 350 requetes sql avant chacun de mes tests (en plus ça me ferais perdre quelques dixaines de seconde ce qui à l'échelle de milliers de tests n'est pas souhaitable).
 
Ce que je cherche à faire c'est juste ajouter une condition d'éxécution dans le trigger lui-meme dans une forme qui n'aurait pas ou tres peu d'impact sur la rapidité du traitement.
 
Mais à défaut d'une meilleure solution je me conterais de ça même si ça me pose d'autres contraintes.


Message édité par fifiz le 21-07-2006 à 10:29:04
n°1410883
Arjuna
Aircraft Ident.: F-MBSD
Posté le 21-07-2006 à 10:35:18  profilanswer
 

tu sais pas lire ? :o
 
DISABLE TRIGGER ALL ON DATABASE
 
:o

n°1410885
Arjuna
Aircraft Ident.: F-MBSD
Posté le 21-07-2006 à 10:36:34  profilanswer
 

à partir du moment où le trigger démarre, même s'il ne fait rien, il a consommé 99% du temps qu'il consommera dans tous les cas : il a créé une transaction, et chargé tout un environnement d'automation... à côté des traîtements que tu fais derrière, c'est énorme.

n°1411128
fifiz
Posté le 21-07-2006 à 14:47:52  profilanswer
 

Si mais j'ai jamais dit que je voulais désactiver tous les trigger de la base =)
il y en a d'autres auxquels je ne veux surtout pas toucher ...
 
Ceci dit si effectivement le fait de l'executer même s'il ne fait rien est déja consommateur l'idée tombe à l'eau et ta première solution devient la seule possible.
 
Merci pour les infos.
 
PS : le SGBD peut être Oracle ou Sybase dans toute une serie de versions


Message édité par fifiz le 21-07-2006 à 14:49:57

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  activer/desactiver des trigger dynamiquement

 

Sujets relatifs
Activer la stéréoscopie sur les geforceProblème : Anim' flash à activer sous IE
Cliquez ici pour activer et utiliser ce contrôle ??????[Mysql 5] Trigger qui bloque un INSERT
script pour désactiver les services DNS dynamique[Fin] Gérer les évenements sur des boutons créés dynamiquement
[PHP 5] pb pour activer mySqltrigger : fabriquer un état des mise à jour de la base de donnée.
Desactiver les avertissements d'expiration lors d'un retourgerer les ancres dynamiquement
Plus de sujets relatifs à : activer/desactiver des trigger dynamiquement


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR