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

PostgreSQL Discussion :

Correction trigger avec un if exists [9.6]


Sujet :

PostgreSQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    477
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 477
    Points : 198
    Points
    198
    Par défaut Correction trigger avec un if exists
    Bonjour à tous et merci d'avance pour votre aide.

    Depuis cet après-midi, j'essaie de mettre en œuvre une série de triggers pour vérifier des règles d'héritage.
    En somme, un utilisateur peut être un administrateur ou un membre. Et un membre peut-être soit un client, soit un vendeur.

    L'idée est de créer un trigger BEFORE INSERT ET UPDATE pour admins, members, customers et vendors.
    Chacun renvoie vers la même routine pour vérifier si un même ne ID se trouve déjà par dans la table fille opposée.

    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
    --==============================================================
    -- PROCEDURE
    --==============================================================
     
    CREATE OR REPLACE FUNCTION check_inherits()
      RETURNS TRIGGER AS $$
    DECLARE
      tableName  VARCHAR;
      columnName VARCHAR;
      valueCheck VARCHAR;
     
    BEGIN
      tableName := TG_ARGV [0] || 's';
      columnName := 'id_' || TG_ARGV [0];
      valueCheck := 'id_' || TG_ARGV [1];
     
      RAISE NOTICE tableName;
      IF EXISTS(SELECT 1
                FROM tableName
                WHERE columnName = new.valueCheck)
      THEN
      END IF;
      RETURN FALSE;
    END;
    $$ LANGUAGE plpgsql;
     
    --==============================================================
    -- TRIGGERS
    --==============================================================
     
    CREATE TRIGGER check_admin
    BEFORE INSERT OR UPDATE ON admins
    FOR EACH ROW EXECUTE PROCEDURE check_inherit('member', 'admin');
     
    CREATE TRIGGER check_member
    BEFORE INSERT OR UPDATE ON members
    FOR EACH ROW EXECUTE PROCEDURE check_inherit('admin', 'member');
     
    CREATE TRIGGER check_customer
    BEFORE INSERT OR UPDATE ON customers
    FOR EACH ROW EXECUTE PROCEDURE check_inherit('vendor', 'customer');
     
    CREATE TRIGGER check_vendor
    BEFORE INSERT OR UPDATE ON vendors
    FOR EACH ROW EXECUTE PROCEDURE check_inherit('customers', 'vendor');
    Merci pour votre précieuse aide.

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 011
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 011
    Points : 23 692
    Points
    23 692
    Par défaut
    Et ?

    Quel est le problème ?
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    477
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 477
    Points : 198
    Points
    198
    Par défaut
    J'en avais oublié la conclusion

    L'erreur est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ERROR: syntax error at or near "tableName"
    Merci,

  4. #4
    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
    Il y a deux problèmes dans ce code...
    1. un trigger retourne SEULEMENT new, old ou null pas autre chose
    2. si vous voulez faire une requête dynamique il faut consulter la doc, paragraphe 41.5.4. Exécuter des commandes dynamiques .

    @+
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    477
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 477
    Points : 198
    Points
    198
    Par défaut
    Merci pour ces explications @alassanediakite.

    Je ne me suis intéressé à PostgreSQL que tout récemment et cela m'a permis de bien avancer,
    Je me permet juste d'ajouter ceci:

    ERROR: column "1" does not exist
    Il reprend la valeur de valueCheck = NEW.id_admin; comme étant une colonne.
    Sauf erreur de ma part, 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    CREATE OR REPLACE FUNCTION check_inherits()
      RETURNS TRIGGER AS $$
    DECLARE
      tableName  VARCHAR;
      columnName VARCHAR;
      valueCheck VARCHAR;
      result     INTEGER;
     
    BEGIN
     
      tableName = TG_ARGV [0] || 's';
      columnName = 'id_' || TG_ARGV [0];
      valueCheck = NEW.id_admin;
     
      EXECUTE 'SELECT 1
                FROM ' || quote_ident(tableName) ||
              ' WHERE ' || quote_ident(columnName) || ' = ' || quote_ident(valueCheck)
      INTO result;
     
      IF result IS NOT NULL
      THEN
        RETURN OLD;
      END IF;
     
      RAISE NOTICE 'Héritage valide.';
     
     
    END;
    $$ LANGUAGE plpgsql;
    Merci encore,

  6. #6
    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
    Enlever quote_ident à valueCheck
    Essayez...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    EXECUTE 'SELECT 1
                FROM ' || quote_ident(tableName) ||
              ' WHERE ' || quote_ident(columnName) || ' = ' || valueCheck
    @+
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    477
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 477
    Points : 198
    Points
    198
    Par défaut
    En plus, je l'avais lu tout à l'heure, quote_ident c'est juste pour les table et les colonnes.
    C'est juste après que tu me fasse la remarque que ça m'a sauté aux yeux.

    Encore merci @alassanediakite

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

Discussions similaires

  1. TRIGGER avec inserted + UPDATE sur INSERTED
    Par shaka84 dans le forum Développement
    Réponses: 3
    Dernier message: 12/04/2006, 10h26
  2. pb trigger avec nested table
    Par evlad dans le forum Oracle
    Réponses: 1
    Dernier message: 29/12/2005, 12h04
  3. Réponses: 2
    Dernier message: 28/12/2005, 13h59
  4. Création vue avec test d'existence
    Par yan77 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/12/2004, 11h44
  5. [Eclipe 2.1.1]Projet avec fichiers sources existants
    Par mfofana dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 26/02/2004, 05h20

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