Précédent   Forum du club des développeurs et IT Pro > Bases de données > MySQL
MySQL Forum d'entraide MySQL. Avant de poster -> FAQ MySQL, Tutoriels MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 10/05/2011, 17h45   #1
lodan
Membre extrêmement actif
 
Avatar de lodan
 
Inscription : juin 2006
Messages : 1 812
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 1 812
Points : 591
Points : 591
Par défaut Peut-on passer une variable à un trigger

Bonsoir,

J'ai une fonction qui crée les trigger qui me sont nécessaire sur une table

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
FUNCTION triggerUpdate($nom_table, $creation = 0)
{
    global $MySql;
 
    $MySql_root = new MySql("localhost", "ma_base", "root", "password");
    // Suppression du TRIGGER
    IF(!empty($creation))
    {
        $queryString = "DROP TRIGGER ".$nom_table."_trigger_maj_insert";
        $MySql_root->query($queryString);
        $queryString = "DROP TRIGGER ".$nom_table."_trigger_maj_update";
        $MySql_root->query($queryString);        
    }
 
    // Chargement de la définition des colonnes de la TABLES
    $requetes = $MySql->queryAllRecords("SHOW FULL COLUMNS FROM ".$nom_table);
 
    // Constitution des conditions de comparaison
    $comparaison = "";
    foreach($requetes AS $ligne)
    {
        // Récupération de la clé principale
        IF($ligne[4] == "PRI") $cle_principal = $ligne[0];
         $comparaison .= " OLD.".$ligne[0]." != NEW.".$ligne[0]." OR";    
 
   }
    $comparaison = substr($comparaison, 0, -2);
 
    // Détection de la présence du TRIGGER. Ne pas le recréer s'il existe
    $queryString = "SELECT EVENT_MANIPULATION
                    FROM INFORMATION_SCHEMA.TRIGGERS
                    WHERE TRIGGER_NAME = '".$nom_table."_trigger_maj_insert'";
 
    $presence = $MySql->queryAllRecords($queryString); 
 
    if(empty($presence))
    {         
        $queryString = "CREATE TRIGGER ".$nom_table."_trigger_maj_insert
                        AFTER INSERT ON ".$nom_table."
                        FOR EACH ROW BEGIN
                            IF NEW.".$cle_principal." != 0
                            THEN
                               INSERT INTO ".$nom_table."_trigger_maj
                                            (".$cle_principal.", user, date_creation) 
                               VALUE (NEW.".$cle_principal.", user(), CURDATE()); 
                            END IF;
                        END
                        ";
 
        $MySql_root->query($queryString);
    }
 
    // Détection de la présence du trigger. Ne pas le recréer s'il existe
    $queryString = "SELECT EVENT_MANIPULATION
                    FROM INFORMATION_SCHEMA.TRIGGERS
                    WHERE TRIGGER_NAME = '".$nom_table."_trigger_maj_update'";
 
    $presence = $MySql->queryAllRecords($queryString); 
 
    IF(empty($presence))
    {         
        $queryString = "CREATE TRIGGER ".$nom_table."_trigger_maj_update
                        AFTER UPDATE ON ".$nom_table."
                        FOR EACH ROW BEGIN
                            IF ".$comparaison."
                            THEN
                               UPDATE ".$nom_table."_trigger_maj 
                               SET user = user(),
                                   date_modification = CURDATE()
                               WHERE ".$cle_principal." = NEW.".$cle_principal."; 
                            END IF;
                        END
                        ";
 
        $MySql_root->query($queryString);
    }
}
J'ai mis une fonction user() qui me permet de récupérer le code utilisateur dans une session.

Mes triggers fonctionnent bien sauf pour cette fonction user().

Comment puis-je passer une variable au trigger ?
__________________
Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.
lodan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 18h35   #2
lodan
Membre extrêmement actif
 
Avatar de lodan
 
Inscription : juin 2006
Messages : 1 812
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 1 812
Points : 591
Points : 591
Après quelques recherches de plus de ci de là, je conclu que ce n'est pas possible.

Alors je vais faire l'inverse, c'est à dire sortir une variable de mon trigger.

Ce qui donne pour l'update :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
$queryString = "CREATE TRIGGER ".$nom_table."_trigger_maj_update
                        AFTER UPDATE ON ".$nom_table."
                        FOR EACH ROW BEGIN
                            DECLARE identifiant INT; 
                            IF ".$comparaison."
                            THEN
                               SET @identifiant = NEW.".$cle_principal.";  
                            END IF;
                        END
                        ";
 
        $MySql_root->query($queryString);
Ensuite j'exécute une autre fonction

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
FUNCTION triggerTableMaj($table, $id)
{
    global $MySql;
 
    $queryString = "SELECT @identifiant";
    $requete = $MySql->queryOneRecord($queryString);
 
    IF(!empty($requete['@identifiant']))
    {
        $queryString = "UPDATE ".$table."
                        SET user = '".$_SESSION["user"]."', 
                            date_modification = CURDATE()
    				WHERE ".$id." ='".$requete['@identifiant']."'" ;
        $MySql->query($queryString);
    }
}
Et maintenant tout fonctionne.

Merci.
__________________
Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.
lodan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2012, 17h41   #3
Rémiz
Membre du Club
 
Rémi
Inscription : mai 2004
Messages : 148
Détails du profil
Informations personnelles :
Nom : Rémi
Âge : 29

Informations forums :
Inscription : mai 2004
Messages : 148
Points : 52
Points : 52
Bonjour,

Ca peut aussi marcher dans l'autre sens

Création du trigger :
Code :
1
2
3
4
5
6
7
CREATE TRIGGER tg_test before INSERT ON test FOR each row begin
	IF (@valeur = 5) then
		SET new.flag = 1;
	else
		SET new.flag = 0;
	end IF;
end
Appel :

Code :
1
2
3
4
5
SET @valeur = 1;
INSERT INTO test SET champ = "dif donc flag=0";
 
SET @valeur = 5;
INSERT INTO test SET champ = "egl donc flag=1";
__________________
Celui qui pose une question est bête 5 minutes, celui qui ne la pose pas est bête toute sa vie...
Rémiz est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 11h54.


 
 
 
 
Partenaires

Hébergement Web