Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Membre extrêmement actif Avatar de lodan
    Inscrit en
    juin 2006
    Messages
    1 818
    Détails du profil
    Informations forums :
    Inscription : juin 2006
    Messages : 1 818
    Points : 592
    Points
    592

    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.

  2. #2
    Membre extrêmement actif Avatar de lodan
    Inscrit en
    juin 2006
    Messages
    1 818
    Détails du profil
    Informations forums :
    Inscription : juin 2006
    Messages : 1 818
    Points : 592
    Points
    592

    Par défaut

    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.

  3. #3
    Membre du Club
    Profil pro Rémi
    Inscrit en
    mai 2004
    Messages
    148
    Détails du profil
    Informations personnelles :
    Nom : Rémi
    Âge : 30

    Informations forums :
    Inscription : mai 2004
    Messages : 148
    Points : 51
    Points
    51

    Par défaut

    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épondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •