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 :

Trigger inopérant lors d'un injection de données


Sujet :

PostgreSQL

  1. #1
    Membre actif

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 370
    Points : 251
    Points
    251
    Par défaut Trigger inopérant lors d'un injection de données
    Bonjour,

    Je viens de créer un trigger avec le code ci dessous mais il ne fonctionne pas. Ou est mon erreur?

    Je veux que lorsque j'intègre mes donnée avec copy ou via une procédure SQL (=> je drop la table, la recrée et l'alimente), je puisse avoir sur les 3 dernière colonne 1 seul colonne avec des données.

    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
    46
    47
    48
    49
    -- Table d'injection centre de cout
    CREATE TABLE calcmi.inj_centre_cout
    (
      mi character varying(10) NOT NULL, -- périmètre
      reseau character(25), -- Réseau
      dept character varying(4), -- Département
      c_cout character varying(15), -- Centre de cout
      ccout_lib character varying(250) NOT NULL, -- Libelle du centre de cout
      Creation character varying(4),
      inactive character varying(4),
      lib_modifier character varying(25),
      CONSTRAINT pk_calcmi.inj_centre_cout PRIMARY KEY (c_cout, ccout_lib)
    )
    WITH (
      OIDS=FALSE
    );
    ALTER TABLE calcmi.inj_centre_cout OWNER TO postgres;
    GRANT ALL ON TABLE calcmi.inj_centre_cout TO lorrainng;
    GRANT ALL ON TABLE calcmi.inj_centre_cout TO postgres;
    COMMENT ON TABLE calcmi.inj_centre_cout IS 'Table d injection des centres de cout';
    COMMENT ON COLUMN calcmi.inj_centre_cout.mi IS 'Perimetre';
    COMMENT ON COLUMN calcmi.inj_centre_cout.reseau IS 'Reseau';
    COMMENT ON COLUMN calcmi.inj_centre_cout.dept IS 'Departement';
    COMMENT ON COLUMN calcmi.inj_centre_cout.ccout_lib IS 'Libelle du centre de cout';
    COMMENT ON COLUMN calcmi.inj_centre_cout.c_cout IS 'Centre de cout';
     
    Create Function calcmi.Injection_OK() Returns Trigger
    As $$
    Begin
    	If Exists (
    		Select
    		*
    		From
    			calcmi.inj_centre_cout AS injcc
    		Where
    			injcc.creation > 0 AND injcc.inactive > 0
    		OR	injcc.inactive > 0 AND injcc.lib_modifier > 0
    		OR	injcc.lib_modifier > 0 AND injcc.creation > 0
    	) Then
    		Return NULL; -- indique à insert d'ignorer la ligne
    	End If;
    	Return NEW; -- indique à insert de traiter la ligne
    End;
    $$ Language plpgsql;
     
    Create Trigger Injection_OK
        Before Insert On calcmi.inj_centre_cout
        For Each Row
        Execute Procedure calcmi.Injection_OK();
    Merci pour votre aide?
    Vandman

  2. #2
    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
    • je drop la table, la recrée et l'alimente
      La suppression de la table, supprimera le trigger (pas la fonction trigger!)
    • Pourquoi comparer des "varchar" à zéro?
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
       
      ccout_lib character varying(250) NOT NULL, -- Libelle du centre de cout
      Creation character varying(4),
      inactive character varying(4),
      lib_modifier character varying(25)
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
       
      injcc.creation > 0 AND injcc.inactive > 0
      OR	injcc.inactive > 0 AND injcc.lib_modifier > 0
      OR	injcc.lib_modifier > 0 AND injcc.creation > 0
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  3. #3
    Membre actif

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 370
    Points : 251
    Points
    251
    Par défaut
    Bonjour,

    Effectivement, Je devrais plutôt tester la condition si différent de NULL.

    L'idée ici est de détecter sur la ligne, si il y 2 ou 3 colonnes avec des données. Si oui, il y a une erreur dans le fichier injecté.

    Bon, je comprends que mes triggers sont inutiles lors de l'injection des données. Y a-t-il un moyen de mettre en place une vérification à l'injection?

    Cordialement,
    Vandman

  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
    Citation Envoyé par vandman Voir le message
    Y a-t-il un moyen de mettre en place une vérification à l'injection?
    Dans ce genre de problème, il faut...
    1. créer une table qui reçoit les données de façon temporaire
    2. charger les données dans la table de données temporaires
    3. nettoyer les données dans cette table
    4. intégrer les données nettoyées dans la table finale
    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 émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Le problème est surtout que ce trigger ne contrôle pas la ligne à insérer, il regarde toutes les autres lignes déjà insérées.

    Pour contrôler la ligne à insérer la condition est du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    IF (
    NEW.creation > 0 AND NEW.inactive > 0
    OR	NEW.inactive > 0 AND NEW.lib_modifier > 0
    etc..
    )
    et il n'y a aucune requête SELECT à faire, les données à insérer sont dans la pseudo-variable NEW.

    Par ailleurs s'il s'agit d'interdire cette combinaison (ça provoque une erreur) et pas seulement pas de la filtrer (la ligne est ignorée) il faudrait faire une contrainte CHECK au lieu d'un trigger.

Discussions similaires

  1. [phpMyAdmin] Problème avec phpMyAdmin lors de l'export de données
    Par shadowbob dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 09/06/2006, 14h12
  2. Réponses: 1
    Dernier message: 04/06/2006, 16h08
  3. erreur lors de l'envoie de donné via les socket.
    Par poporiding dans le forum C++
    Réponses: 1
    Dernier message: 23/05/2006, 14h23
  4. [MySQL] contenu champs de table effacé lors de mise à jour de donnée
    Par gregos13 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 06/04/2006, 17h18
  5. Erreur charset lors d'un transfert de données
    Par Cyberbob002 dans le forum PostgreSQL
    Réponses: 16
    Dernier message: 29/11/2005, 15h00

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