Précédent   Forum des professionnels en informatique > 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 Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/05/2011, 17h45   #1
Membre extrêmement actif
 
Avatar de lodan
 
Inscription : juin 2006
Messages : 1 804
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 1 804
Points : 587
Points : 587
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
Membre extrêmement actif
 
Avatar de lodan
 
Inscription : juin 2006
Messages : 1 804
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 1 804
Points : 587
Points : 587
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
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h42.


 
 
 
 
Partenaires

Hébergement Web