IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Procédural MySQL Discussion :

Peut-on passer une variable à un trigger


Sujet :

SQL Procédural MySQL

  1. #1
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 régulier
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Points : 87
    Points
    87
    Par défaut
    Bonjour,

    Ca peut aussi marcher dans l'autre sens

    Création du trigger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/07/2011, 10h00
  2. Réponses: 4
    Dernier message: 15/04/2010, 10h34
  3. [Custom Tags 1.2] Passer une variable comme valeur d'attribut d'un tag jsp
    Par Pi2 dans le forum Taglibs
    Réponses: 7
    Dernier message: 16/09/2005, 15h44
  4. Passer une variable entre deux fenêtres
    Par DeezerD dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 17/08/2005, 10h52
  5. [Struts] Passer une variable dans l'url
    Par pilz dans le forum Struts 1
    Réponses: 2
    Dernier message: 30/03/2005, 16h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo