Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/08/2011, 11h41   #1
Candidat au titre de Membre du Club
 
Inscription : septembre 2003
Messages : 29
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 29
Points : 10
Points : 10
Envoyer un message via MSN à sky_perrinos
Par défaut création dynamique de triggers

Bonjour à tous,

Je cherche à avoir un script de création de trigger dynamique de façon à pouvoir le passer sur plusieurs tables en ne changeant que le nom de table. J'avais prévu de faire une procédure de création de trigger avec le nom de table en paramètre, puis d'appeler cette procédure dans une boucle qui parcourt toutes les tables auxquelles je veux ajouter le trigger; cela aurait donné quelque chose comme ça:

Code :
1
2
3
4
5
6
7
8
9
10
11
 
CREATE procedure Add_Trigger (IN table_nom varchar(20))
begin
# prépération de la requete de création du trigger
SET @trigger_creation = concat("create trigger set_date_modification_",table_nom," 
before update on ",table_nom,"
for each row set new.date_modification = now()");
# execution de la requete
prepare stmt_create FROM @trigger_creation; 
execute stmt_create; deallocate prepare stmt_create;
end
puis dans une autre routine je l'aurai appelée:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
CREATE procedure Add_trigger_on_all (IN schema_nom varchar(20))
begin
declare done int DEFAULT 0; #variable pour la boucle
declare table_nom varchar(50); # variable pour les noms de tables parcourues
 
declare cursor_tables cursor FOR #curseurr de parcours des tables
SELECT DISTINCT table_name FROM information_schema.TABLES
WHERE table_schema LIKE schema_nom;
 
#handler pour le curseur
declare continue handler FOR sqlstate '02000' SET done = 1;
 
#boucle grâce au curseur:
open cursor_tables;
repeat
   fetch cursor_tables INTO table_nom
   #appel de la routine de création du trigger:
   IF NOT done then call Add_Trigger(table_nom); end IF; 
until done end repeat;
close cursor_tables;
 
end;
Malheureusement il est indiqué dans la doc mysql qu'une routine ne peut pas contenir de create trigger!!
Est-ce que quelqu'un sait comment je pourrais scripter ma création de trigger en masse d'une autre manière?

Merci beaucoup, Thomas
sky_perrinos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2011, 00h41   #2
Membre du Club
 
Inscription : août 2009
Messages : 66
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 66
Points : 69
Points : 69
A ta place, j'utiliserais un script dans un langage tiers (PHP par exemple) pour générer les requêtes de création de trigger.

Ce sera d'ailleurs peut-être plus facile à écrire qu'une procédure stockée.
NicoD. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 19h29   #3
Invité de passage
 
Inscription : juillet 2009
Messages : 9
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 9
Points : 4
Points : 4
salut sky !!

Ma solution pourrait peut être t'aider ! Elle se trouve ici :

http://www.developpez.net/forums/d11...ger-generique/

J’espère qu'elle te sera assez explicite !! A ++
Delors est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h39.


 
 
 
 
Partenaires

Hébergement Web