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 PostgreSQL Discussion :

Fonctions et triggers


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Apprenti Ingénieur R&D
    Inscrit en
    Octobre 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Apprenti Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 20
    Points : 13
    Points
    13
    Par défaut Fonctions et triggers
    Bonjour à tous,

    J'ai un léger soucis avec une fonction et un trigger en PL pgSQL.

    Je dispose d'une table 'énumération' (je ne donne pas les détails de l'implémentation, mais il s'agit d'une table et non d'un type énum). Lors de la suppression d'une occurrence dans cette table, je veux vérifier qu'elle n'est pas utilisée par une occurrence de la table 'log'.

    Mon code est donc le suivant:

    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
     
    DROP TRIGGER log_enumeration_value_on_delete ON log_enumeration_value CASCADE;
     
    CREATE OR REPLACE FUNCTION log_enumeration_value_on_delete()
    	RETURNS TRIGGER LANGUAGE plpgsql AS $$
    	DECLARE
    		row RECORD;
    	BEGIN
    		FOR row IN (SELECT * FROM log WHERE id_log_name = OLD."id_log_name" AND value_integer = OLD."id_log_enumeration_value") LOOP
    			IF row IS NOT NULL THEN
    				RAISE EXCEPTION 'The log enumeration value is used by at least one log';
    			END IF;
    		END LOOP;
    		RETURN OLD;
    	END
    $$;
     
    CREATE TRIGGER "log_enumeration_value_on_delete"
    	BEFORE DELETE ON log_enumeration_value
    	FOR EACH ROW EXECUTE PROCEDURE log_enumeration_value_on_delete()
    ;
    Cependant, dans tout les cas la suppression se fait sans soucis, même lorsque je devrais récupérer une exception

    Avez vous une idée ?

    EDIT:

    Après un peu de debug, je me rends compte que je ne rentre jamais dans ma boucle FOR !
    J'ai donc surement une erreur sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FOR row IN (SELECT * FROM log WHERE id_log_name = OLD."id_log_name" AND value_integer = OLD."id_log_enumeration_value") LOOP
    mais j'ai un peu de mal à comprendre où :/

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Pourquoi passer par un trigger ? Les clefs étrangères servent à cela, garantir l'intégrité référentielle de votre base de données.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Apprenti Ingénieur R&D
    Inscrit en
    Octobre 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Apprenti Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    Merci de ta réponse.

    Ici les clées étrangères ne me suffisent pas. J'ai une table entre les deux relations et de plus la 'value_integer' ne référence par forcément un 'id_log_enumeration_value' de mon autre table.
    Je suis donc obligé de passer par un trigger SQL.

    Une idée de la raison pour laquelle je n'entre jamais dans ma boucle FOR ?

  4. #4
    Membre à l'essai
    Homme Profil pro
    Apprenti Ingénieur R&D
    Inscrit en
    Octobre 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Apprenti Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    Problème résolu
    En fait, je n'avais même pas besoin de boucle ! Un simple count(*) pour vérifier qu'il est différent de 0

  5. #5
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    Salut
    Un c'est encore mieux.
    @+
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 23/06/2023, 15h52
  2. Problème fonction et trigger sous 7.2
    Par anoukhan dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 22/06/2005, 22h53
  3. lancer fonction sans trigger
    Par $grm$ dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 04/04/2005, 10h58

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