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

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    février 2020
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2020
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Trigger mise à jour de deux tables reliées par une clé étrangère
    Bonjour,

    Je suis une novice en SQL qui ai besoin de l'utiliser dans le cadre d'un stage, j'ai donc appris seule et il me manque peut être des bases que je n'ai pas pu prendre le temps d'acquérir par manque de temps... j'ai donc peut être fait des erreurs idiotes et je m'en excuse.

    J'ai trois tables pour l'instant : une première table "export_br_oper", et deux autres "lea_agbio_operateur_identification" et "lea_agbio_operateur_geographie".
    • La table "export_br_oper" n'a pas de clé primaire ni étrangère et contient des données brutes en vrac.
    • Dans la table "lea_agbio_operateur_identification", la clé primaire est "id_operateur"
    • Dans la table "lea_agbio_operateur_geographie", la clé primaire est aussi "id_operateur"
    • La clé primaire "id_operateur" de la table "lea_agbio_operateur_geographie" est aussi clé étrangère dans la table "lea_agbio_operateur_identification" donc il faut que tous les id présents dans la table "lea_agbio_operateur_geographie"soient d'abord présents dans la table "lea_agbio_operateur_identification" !


    J'ai créé deux triggers afin de mettre à jour les données des deux tables "lea_agbio_operateur_identification" et "lea_agbio_operateur_geographie" lorsqu'il y a une importation dans "export_br_oper".
    Cependant, quand je fais un test en rajoutant une ligne test dans la table "export_br_oper", j'ai cette erreur :
    SQL Error [23503]: ERREUR: une instruction insert ou update sur la table « lea_agbio_operateur_geographie » viole la contrainte de clé étrangère
    Détail : La clé (id_operateur)=(test) n'est pas présente dans la table « lea_agbio_operateur_identification ».
    Comment puis-je régler ce problème ?
    Est-il possible de faire quelque chose du style "EXECUTE PROCEDURE fonction1() AND fonction2()" pour rassembler tout ça dans un trigger unique qui met bien les infos dans l'ordre dans les tables (donc exécute d'abord la fonction qui remplit le tableau identification, puis celle qui remplit geographie) ?
    Ou bien faut il faire une seule fonction (qui du coup va être très grosse) et qui reprend les deux fonctions que j'ai pour l'instant ? Ou une autre façon de faire à laquelle je n'ai pas pensé ?

    Voici ce que j'ai fait pour l'instant comme code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    create or replace function lea_agbio_actu_op_identification() 
    	returns trigger as $lea_agbio_actu_op_identification$
    	begin 
    		--liste de toutes les instructions (qui fonctionnaient lors des tests faits avant de rajouter le trigger pour la table geographie)
    	end;
    $lea_agbio_actu_op_identification$ language plpgsql;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    drop trigger if exists lea_agbio_actu_op_identification on export_br_oper;
     
    CREATE TRIGGER lea_agbio_actu_op_identification
    	after INSERT ON export_br_oper 
    	FOR EACH ROW 
    	EXECUTE PROCEDURE lea_agbio_actu_op_identification();
    et la deuxième fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    create or replace function lea_agbio_actu_op_geographie() 
    	returns trigger as $lea_agbio_actu_op_geographie$
    	begin 
    		--liste d'instructions
    	end;
    $lea_agbio_actu_op_geographie$ language plpgsql;
    deuxième trigger:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    drop trigger if exists lea_agbio_actu_op_geographie on export_br_oper;
     
    CREATE TRIGGER lea_agbio_actu_op_geographie
    	after INSERT ON export_br_oper 
    	FOR EACH ROW 
    	EXECUTE PROCEDURE lea_agbio_actu_op_geographie();
    Si besoin, je peux fournir les codes internes aux fonctions mais ça ne me semblait pas utile et comme elles sont assez longues, je ne l'ai pas mis là.
    Il y aura 4 tables opérateur différentes ensuite avec d'autres infos, toutes reliées, mais j'imagine que si j'arrive à trouver une solution pour deux tables je trouverais pour quatre tables.

    Merci d'avance !

  2. #2
    Membre averti
    Homme Profil pro
    developpeur sql et scripting
    Inscrit en
    août 2014
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : developpeur sql et scripting
    Secteur : Santé

    Informations forums :
    Inscription : août 2014
    Messages : 213
    Points : 343
    Points
    343
    Par défaut
    Bonjour,

    Tout d'abord, pourquoi deux fonctions différentes ? Fonctionnellement parlant, quand vous ajoutez une ligne dans la table de données en vrac, vous avez tout sur la ligne qui vous permet de mettre à jour vos deux tables ou pas ?

    Bisous bisous

Discussions similaires

  1. Update sur deux table relié par une clé étrangère.
    Par labib23dz dans le forum Développement
    Réponses: 5
    Dernier message: 18/04/2019, 12h40
  2. [AC-2010] Mise à jour entres deux tables
    Par melanieuragar dans le forum Access
    Réponses: 0
    Dernier message: 10/12/2018, 09h52
  3. [MySQL-5.5] Problème avec une requête de mise à jour entre deux tables
    Par hermes1383 dans le forum Requêtes
    Réponses: 1
    Dernier message: 10/11/2014, 11h52
  4. Mise à jour entre deux tables
    Par yvautrin dans le forum Requêtes
    Réponses: 5
    Dernier message: 28/08/2014, 16h00
  5. Réponses: 5
    Dernier message: 19/03/2008, 11h41

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