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 :

Trigger Cascade delete


Sujet :

SQL Procédural MySQL

  1. #1
    Membre éclairé Avatar de Pymento
    Homme Profil pro
    Ingé. Info.
    Inscrit en
    Janvier 2008
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingé. Info.

    Informations forums :
    Inscription : Janvier 2008
    Messages : 366
    Par défaut Trigger Cascade delete
    Bonjour, je débute dans les triggers, je vous explique succinctement mon objectif: emuler un "cascade on delete" étant donné que j'ai du utiliser une table MyIsam.

    Donc j'ai deux table une innoDB l'autre Isam, je veut simplement quand je supprime une ligne sur table1 supprimer la ligne correspondante par l'id dans table2.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    DELIMITER $$
    CREATE TRIGGER before_delete_element
    BEFORE DELETE ON elements
    DELETE FROM file_info WHERE  table1.id=table2.id
    DELIMITER ;
    J'execute ça dans phpMyADmin dans la section SQL, et il me dit OK c'est bon tout va bien, par contre forcément, rien ne marche(SHOW TRIGGERS ne me renvoi rien). Et impossible d'y mettre la main dessus, je ne sais pas ou ça va. Si quelqu'un pourrai en premier temps me corriger ma requête et m'expliquer comment "gérer" les triggers dans mysql.

    Merci d'avance.

  2. #2
    Membre éclairé Avatar de Pymento
    Homme Profil pro
    Ingé. Info.
    Inscrit en
    Janvier 2008
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingé. Info.

    Informations forums :
    Inscription : Janvier 2008
    Messages : 366
    Par défaut
    Bon j'ai semble-t-il trouvé la bonne requête,
    *


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    delimiter $$
    CREATE TRIGGER delete_cascade_element
    AFTER delete ON elements
    FOR EACH ROW
    BEGIN
    DELETE FROM file_info WHERE file_id=Old.id
    END$$
    delimiter ;
    Mais j'ai un soucis de syntaxe près de END ligne 6 d'après phpMyAdmin.
    J'ai essayé tout ce que j'ai trouvé comme délimiter sur le net mais toujours la même erreur.

  3. #3
    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
    Billets dans le blog
    1
    Par défaut
    salut,

    il manque le ; à la fin de la ligne

  4. #4
    Membre éclairé Avatar de Pymento
    Homme Profil pro
    Ingé. Info.
    Inscrit en
    Janvier 2008
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingé. Info.

    Informations forums :
    Inscription : Janvier 2008
    Messages : 366
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    delimiter $$
    CREATE TRIGGER delete_cascade_element
    AFTER DELETE ON elements
    FOR EACH ROW
    BEGIN
    DELETE FROM file_info WHERE file_id=Old.id
    END$$;
    delimiter ;
    j'avais essayé de mettre ";" avant $$ mais pas comme ça effectivement, "ça passe" pas d'erreur en revanche impossible avec un
    de voir le bout de son nez !

  5. #5
    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
    Billets dans le blog
    1
    Par défaut
    pense que ce que tu mets dans un trigger, une procédure ou une fonction stockée c'est du code sql donc on finit proprement la ligne avec un ;

    d'où l'utilisation de delimiter pour changer la fin de ligne pour le create et bien avoir le ; dans le corps de celui-ci

    tu dois préciser la base visée, la commande c'est:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    show triggers from nom_base;

  6. #6
    Membre éclairé Avatar de Pymento
    Homme Profil pro
    Ingé. Info.
    Inscrit en
    Janvier 2008
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingé. Info.

    Informations forums :
    Inscription : Janvier 2008
    Messages : 366
    Par défaut
    Citation Envoyé par ericd69 Voir le message
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    show triggers from nom_base;
    Toujours le même résultat -> Rien

  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
    Billets dans le blog
    1
    Par défaut
    si tu as accès à information_schema

    essaye ça:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select trigger_schema, trigger_name, action_statement
    from information_schema.triggers

  8. #8
    Membre éclairé Avatar de Pymento
    Homme Profil pro
    Ingé. Info.
    Inscrit en
    Janvier 2008
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingé. Info.

    Informations forums :
    Inscription : Janvier 2008
    Messages : 366
    Par défaut
    Ok, je vais dans Triggers et j'obtiens ça :

    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
    TRIGGER_CATALOG 
    TRIGGER_SCHEMA 
    TRIGGER_NAME 
    EVENT_MANIPULATION 
    EVENT_OBJECT_CATALOG 
    EVENT_OBJECT_SCHEM
    EVENT_OBJECT_TABLE 
    ACTION_ORDER 
    ACTION_CONDITION
    ACTION_STATEMENT 
    ACTION_ORIENTATION 
    ACTION_TIMING 
    ACTION_REFERENCE_OLD_TABLE 
    ACTION_REFERENCE_NEW_TABLE 
    ACTION_REFERENCE_OLD_ROW 	
    ACTION_REFERENCE_NEW_ROW 
    CREATED 
    SQL_MODE 	
    DEFINER 
    CHARACTER_SET_CLIENT 
    COLLATION_CONNECTION 
    DATABASE_COLLATION
    Les champs donc, et aucune entrée.
    Donc je n'ai pas de trigger enregistré.
    Le problème viendrait donc de la création elle même ?

    sachant que en executant le dernier bloc sql du post ça me donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Votre requête SQL a été exécutée avec succès

  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
    Billets dans le blog
    1
    Par défaut
    trigger_schema c'est le nom de ta base et trigger name le nom du trigger...

    au fait tu as bien un use avant ta création de trigger pour dire dans quelle base tu es?

  10. #10
    Membre éclairé Avatar de Pymento
    Homme Profil pro
    Ingé. Info.
    Inscrit en
    Janvier 2008
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingé. Info.

    Informations forums :
    Inscription : Janvier 2008
    Messages : 366
    Par défaut
    trigger_schema c'est le nom de ta base et trigger name le nom du trigger...
    Ouai c'est tout nouveau pour moi, j'ai mis ça direct, mais ça me l'a pris comme un SELECT *


    au fait tu as bien un use avant ta création de trigger pour dire dans quelle base tu es?
    Non je viens de le rajouter mais ça change rien, de toute façon il sait dans quelle base je suis non ? (en étant sur phpMyAdmin et sur la section SQL à l'intérieur de ma base)

  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
    Billets dans le blog
    1
    Par défaut
    oui normalement si tu as sélectionné une db dans la liste avant...

    ça devrait pas être un before delete ton événement pour pouvoir accéder à old dans le trigger?

  12. #12
    Membre éclairé Avatar de Pymento
    Homme Profil pro
    Ingé. Info.
    Inscrit en
    Janvier 2008
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingé. Info.

    Informations forums :
    Inscription : Janvier 2008
    Messages : 366
    Par défaut
    Concrètement ça devrait pas poser de pb au moins pour la création non ? mais j'ai quand même essayé avec le before, toujours pareil... je commence à désespérer

  13. #13
    Membre éclairé Avatar de Pymento
    Homme Profil pro
    Ingé. Info.
    Inscrit en
    Janvier 2008
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingé. Info.

    Informations forums :
    Inscription : Janvier 2008
    Messages : 366
    Par défaut
    Je viens même d'essayer de faire le triggers uniquement sur ma propre table, pour exclure un éventuel problème entre innodb et myIsam.

    ->Toujours pas

  14. #14
    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
    Billets dans le blog
    1
    Par défaut
    j'ai relu la doc...

    pour l'instant tu ne peux pas faire référence directement à une table dedans

    tu ne peux utiliser que old ou new

    je pense que tu vas devoir opter pour une procédure stockée qui feras ton delete principal et ensuite le répercutera sur la table secondaire...

    Le déclencheur ne peut pas faire référence directe aux tables par leur nom, y copmris la table à laquelle il est associé. Par contre, vous pouvez utiliser les mots clés OLD (ancien en anglais) et NEW (nouveau en anglais). OLD fait référence à la ligne existante avant la modification ou l'effacement. NEW faire référence à la nouvelle ligne insérée ou à la ligne modifiée.

  15. #15
    Membre éclairé Avatar de Pymento
    Homme Profil pro
    Ingé. Info.
    Inscrit en
    Janvier 2008
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingé. Info.

    Informations forums :
    Inscription : Janvier 2008
    Messages : 366
    Par défaut
    Houla, ça change complètement ma conception du trigger.... j'ai un soucis pour les procédures stockées par contre...
    En gros j'ai des "delete on cascade" et pas mal de profondeur du coup avec une procédure stockée je sais pas si je vais pouvoir faire grand chose non ?
    Sachant que je sais justement pas quelles lignes seront effacées... :/

  16. #16
    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
    Billets dans le blog
    1
    Par défaut
    si tu peux avoir 255 niveau de récursion

    oui ils ont implémenté les trigger minimalistes lol... j'avoue que j'en ai pas utilisé depuis 2006 quand je tripatouillais oracle 9i ...

    donc des triggers un peu évolués

    si tes données sont réparties juste dans des tables dépendantes sans parcours récursif sur elles tu mais juste tes delete les uns derrière les autres... tout simple

    sinon tu crées autant de procédures stockées qui traitent la récursion sur une table particulière (vu que tu peux pas faire de requête préparée qui risqueraient de s'auto appeler)


  17. #17
    Membre éclairé Avatar de Pymento
    Homme Profil pro
    Ingé. Info.
    Inscrit en
    Janvier 2008
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingé. Info.

    Informations forums :
    Inscription : Janvier 2008
    Messages : 366
    Par défaut
    EUREKÂ


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    DELIMITER $$
    CREATE TRIGGER delete_cascade_element
    AFTER DELETE ON elements
    FOR EACH ROW
    BEGIN
    DELETE FROM file_info WHERE file_id=Old.id;
    END$$
    DELIMITER ;
    ça s'enregistre bien comme ça !

  18. #18
    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
    Billets dans le blog
    1
    Par défaut
    ah oui le for each row pour dire que tu veux que ça s'applique à toutes les ligne c'est vrai lol

    mais est ce qu'il marche?

  19. #19
    Membre éclairé Avatar de Pymento
    Homme Profil pro
    Ingé. Info.
    Inscrit en
    Janvier 2008
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingé. Info.

    Informations forums :
    Inscription : Janvier 2008
    Messages : 366
    Par défaut
    Non c'était juste la partie ";" & "delimiter" mal placé enfait (à la fin de la requête).

    alors si il marche, ça, j'ai pas testé, je ferai ça demain matin ! je te tiens au jus !

  20. #20
    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
    Billets dans le blog
    1
    Par défaut
    ok sinon procédure stockée :p

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Trigger after delete
    Par festayre47 dans le forum PL/SQL
    Réponses: 8
    Dernier message: 27/12/2007, 12h02
  2. [SQL2005]Trigger On delete, insert, update(colonne)
    Par slim dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 27/02/2007, 16h36
  3. [ EJB ] [JBoss ] [ XDoclet ] probleme avec cascade-delete
    Par Houbbba dans le forum Wildfly/JBoss
    Réponses: 4
    Dernier message: 03/05/2006, 10h05
  4. [Trigger] Trigger cascade table hiérarchique
    Par CUCARACHA dans le forum Développement
    Réponses: 1
    Dernier message: 12/02/2006, 18h24
  5. [EJB2.1 Entity] [XDOCLET]Cascade delete
    Par SEMPERE Benjamin dans le forum Java EE
    Réponses: 3
    Dernier message: 23/02/2005, 09h29

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