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

Requêtes MySQL Discussion :

trigger pour supprimer les lignes d'une table


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2010
    Messages : 277
    Points : 122
    Points
    122
    Par défaut trigger pour supprimer les lignes d'une table
    Bonjour

    j'ai fais un trigger qui after insert rempli une table.
    Ensuite j'aimerai que le trigger vide la table qui a recu l'enregitrement.

    Comme c'est celle qui contient le trigger => ca plante en me disant que la table est occupé par le trigger
    Auriez vous une idée de comment faire?

    voici mon code

    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
    BEGIN
     INSERT INTO Tempo (RefClient, RefFacture, Utilisateur, DateRelance, Commentaires, DatePromessePayement) 
    Select TFactures.RefClients, TFactures.RefFacture, tblRelanceProv.Utilisateur,
      NOW() As DateRelance, tblRelanceProv.Commentaires, tblRelanceProv.DatePromise
    From tblRelanceProv Inner Join
      TFactures On TFactures.RefClients = tblRelanceProv.RefClient Left Join
      TRelance On TRelance.RefFacture = TFactures.RefFacture
      WHERE 
    ( (TFactures.FactPaye = 0) AND (TRelance.DatePromessePayement < NOW()) OR (TFactures.FactPaye = 0) AND (TFactures.DateLimitePayement < NOW()) )
    order by TFactures.RefClients LIMIT 1; 
     
    -- Insertion de la table temporaire dans la Table TRelance
    INSERT INTO TRelance (TRelance.RefFacture, TRelance.Utilisateur, TRelance.DateRelance, TRelance.Commentaires, TRelance.DatePromessePayement)
    select RefFacture, Utilisateur, DateRelance, Commentaires, DatePromessePayement
    FROM Tempo;
     
    delete from tblRelanceProv;
    END
    Merci d'avance
    Gilles

  2. #2
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    salut,

    c'est une procédure stockée ton truc que tu veux faire pas un trigger...!?
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2010
    Messages : 277
    Points : 122
    Points
    122
    Par défaut
    Salut

    Merci de ta réponse

    Non c'est un trigger qui se declenche lorsqu'une ligne est inséré.

  4. #4
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    le problème c'est que tu n'as pas bien compris le but d'un trigger...

    et ton code ressemble plus à celui d'une procédure

    montre l'entete de ton trigger... il ne passe pas si tu fais une "référence circulaire" à la table avec un de tes requête dedans...
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2010
    Messages : 277
    Points : 122
    Points
    122
    Par défaut
    Il ne passe pas a cause de ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM tblRelanceProv;
    Les triggers ne pouvant enlever un enregistrement sur la table sur laquelle ils sont (enfin d'aprés ce que j'ai compris)

    voila le code complet

    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
    DROP TRIGGER IF EXISTS `trigger_MAJ_Relance`;
    DELIMITER //
    CREATE TRIGGER `trigger_MAJ_Relance` AFTER INSERT ON `tblRelanceProv`
     FOR EACH ROW BEGIN
     
        CREATE TEMPORARY TABLE IF NOT EXISTS Tempo (
    	RefClient varchar (20) default '',
    	RefFacture varchar (20) default '',
    	Utilisateur varchar (20) default '',
    	DateRelance datetime,
    	Commentaires varchar (100) default '',
    	DatePromessePayement datetime);
     
     INSERT INTO Tempo (RefClient, RefFacture, Utilisateur, DateRelance, Commentaires, DatePromessePayement) 
    Select TFactures.RefClients, TFactures.RefFacture, tblRelanceProv.Utilisateur,
      NOW() As DateRelance, tblRelanceProv.Commentaires, tblRelanceProv.DatePromise
    From tblRelanceProv Inner Join
      TFactures On TFactures.RefClients = tblRelanceProv.RefClient Left Join
      TRelance On TRelance.RefFacture = TFactures.RefFacture
      WHERE 
    ( (TFactures.FactPaye = 0) AND (TRelance.DatePromessePayement < NOW()) OR (TFactures.FactPaye = 0) AND (TFactures.DateLimitePayement < NOW()) )
    order by tblRelanceProv.DateRelance DESC LIMIT 1; 
    -- Insertion de la table temporaire dans la Table TRelance
    INSERT INTO TRelance (TRelance.RefFacture, TRelance.Utilisateur, TRelance.DateRelance, TRelance.Commentaires, TRelance.DatePromessePayement)
    select RefFacture, Utilisateur, DateRelance, Commentaires, DatePromessePayement
    FROM Tempo;
     
    DELETE FROM tblRelanceProv;
     
    END
    //
    DELIMITER ;

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Dans ce cas, il vaut mieux faire une procédure.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    oui car ça fait une référence circulaire, tu peux pas faire d'insert, update, delete dans trigger sur la table sur laquelle il porte, c'est logique... par contre tu peux le faire sur n'importe quelle autre



    tu dois passer par une procédure stockée qui fera les différentes actions dont l'insertion qui déclenchait ton trigger que tu appelleras du coup à la place de l'insertion
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  8. #8
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2010
    Messages : 277
    Points : 122
    Points
    122
    Par défaut
    Merci de vos réponse.

    C'est un fichier php qui insert l'enregistrement.

    Je ne comprends pas bien ce que vous voulez que je fasse avec une procédure stocké.

    Je vais vous expliquez toute la fonction.

    Depuis un téléphone android j'envoie 4 Informations dans un php.
    ces 4 info sont envoyé dans la table provisoire tblRelanceProv.
    Des qu'une ligne est ajouté dans la tblRelanceProv, je veux qu'une autre table (beaucoup plus complexe soit rempli).
    Ensuite je veux vider la table Provisoire tblRelanceProv

    Donc je fais:
    a l'arrivé d'une nouvelle ligne (donc dans un trigger, les PS ne pouvant rien détecter) => je récupére certaines informations qui se trouve dans d'autre tables pour recrée la table compliqué.



    En resumé:
    Trigger qui se declenche a l'arrivé d'une info dans la table
    Procedure stocké qui va alimenter la table compliqué

    Alors oui j'aurais pu ne mettre dans le trigger que le lancement de la SP, mais je n'y trouve aucun interet sauf a vérouiller la table tblRelanceProv durant tout le temps de traitement de la PS, sachant qu'elle est aussi activé par d'autre éléments.

    J'espere avoir été clair.

    J'ai palié a ce manque de mysql en faisant un evenement qui va vider la table, mais je trouve ca pas terrible du tout.

    C'est pour ca que je demandais s'il y avait une autre facon de faire.

    Merci de m'avoir lu jusqu'au bout.
    Gilles

  9. #9
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    c'est normal que tu ne puisse pas faire d'action sur la même table autrement tu déclencherais de potentiels autre triggers qui pourraient eux même faire des actions sur la table et donc redéclencher le trigger initial ce qui ferait une boucle sans fin jusqu'au plantage par "segmentation fault", c'est un exemple de ce qu'on appelle une référence circulaire: toute action qui engendre une boucle sans fin ou des appels de fonction jusqu'à saturation de la mémoire.

    déjà est ce que la table temporaire est bien nécessaire?

    modélisation de la bd bien pensé?

    si oui à tout ça, ton php peut faire un "call" sur la procédure qui prend en paramètre les valeurs que tu passais à ton insert originel et fait les traitements en interne

    sais tu que tu as le droit à des variables en procédural ainsi qu'à toutes les instructions de rupture de code classique? ça doit pouvoir permettre de gérer ta problématique non et ce sans passer forcément par une table temporaire?

    bref faut voir le besoin réel...
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  10. #10
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2010
    Messages : 277
    Points : 122
    Points
    122
    Par défaut
    Disons que je ne voie pas d'autre facon de faire, meme s'il doit surement il y en avoir.

    la Table que l'on va appeler TAndroid (c'est celle qui doit etre rempli au final et qui sert a allimenter en infos le téléphone)
    Est actuellement rempli a l'aide d'une procedure stocké.
    Cette procedure fait:
    récupérer dans differentes tables pleins d'infos
    Fait un mixte de ces infos pour en créer d'autres.
    Les places dans TAndroid

    Cette procedure est appelé a partir du client final (soit mon ordi, lorsque je fais un changement sur une des tables)
    Elle doit également etre appellé des que l'on rajoute une info depuis le téléphone dans la table temporaire.

    La table temporaire est necessaire (a mon avis) car:
    4 infos proviennent de la tables temporaire.
    j'ai besoin pour remplir la table d'une 5eme infos qui se trouve dans une autre table et qui est le champ clé de la table finale.

    En gros, tu l'as compris c'est un systeme de relance:
    Soit a partir du téléphone, soit a partir de l'ordi:
    Le téléphone me renvoie la Reférence du client
    de la, je dois aller récupérer toutes les factures du client qui ne sont pas réglé et leur affecter la relance, il me faut donc toutes les Références de factures correspondante.
    Ensuite je mets a jour la table "d'alimentation" d'Android.

    En suivant ton idée j'aurais:
    un php qui recoit les 4 infos
    Une procedure appellé par le php, qui une fois qu'elle aura récupéré la 5ème info remplira ma table de relance puis ira déclencher la procedure de mise a jour de la TAndroid.
    ou
    Gestion dans le php de la récupération de la 5eme info et écriture direct dans la table finale
    puis mise a jour par la procedure de la TAndroid


    Ca me plait bien, cela fait beaucoup plus propre que ce que j'ai fais (meme si ca marche actuellement)
    Merci du coup de main

  11. #11
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    ça oui:
    Citation Envoyé par gilles_906 Voir le message
    un php qui recoit les 4 infos
    Une procedure appellé par le php, qui une fois qu'elle aura récupéré la 5ème info remplira ma table de relance puis ira déclencher la procedure de mise a jour de la TAndroid.
    et en plus en terme de sécurité n'appeler que des procédures stocker permet d'utiliser un utilisateur avec seulement "grant execute" sur la bd et qui peut même n'avoir aucun mot de passe

    car je rappelle que ton application est facilement récupérable pour faire du reverse engineering... donc d'avoir l'utilisateur et le mot de passe
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  12. #12
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2010
    Messages : 277
    Points : 122
    Points
    122
    Par défaut
    Bonjour

    J'ai refais le php suivant ton idée et tout fonctionne très bien, je n'ai plus de trigger

    Par contre pour le reverse engineering (hormis le fait qu'il faudrait que le mec me vol le portable et qu'en plus il soit capable de faire du reverse engineering car l'appli ne sera pas diffusé)
    Le seul mot de passe qu'il récupére dans tout les cas sera celui du htaccess du dossier dans lequel ce trouve les php et ce n'est pas le meme que celui pour se connecter au serveur ou a la base.

    Merci encore pour les conseils
    Gilles

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD14] Supprimer les lignes d'une table fenêtre
    Par Raptor92 dans le forum WinDev
    Réponses: 13
    Dernier message: 08/09/2009, 11h09
  2. Supprimer les lignes d'une table dans une autre table
    Par blastmind dans le forum SAS Base
    Réponses: 2
    Dernier message: 28/04/2009, 14h17
  3. Réponses: 3
    Dernier message: 28/04/2009, 00h42
  4. pour supprimer les doublons d'une table qcq
    Par lamjed dans le forum Oracle
    Réponses: 7
    Dernier message: 19/12/2008, 16h42
  5. [SQL] Supprimer les lignes d'une table sql
    Par radhwene dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 28/06/2007, 11h48

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