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

PL/SQL Oracle Discussion :

Récupérer une valeur dans un trigger avant insertion


Sujet :

PL/SQL Oracle

  1. #1
    Membre averti
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2018
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2018
    Messages : 32
    Par défaut Récupérer une valeur dans un trigger avant insertion
    Bonjour à tous, j'ai un petit souci, et malgré des recherches et autres je plante x) ...

    Voici le contexte,

    J'ai une table qui est alimenté cependant cette table à une contrainte d'unicité et etrangère avec une table d'utilisateur.
    C'est pourquoi je souhaite crée un trigger permettant de juste récupéré le nom de l'utilisateur que nous allons inséré dans notre table afin de crée un utilisateurs avant dans l'autre table.

    Et voici ce à quoi j'en suis arrivé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE OR REPLACE TRIGGER add_pool_contact
    BEFORE INSERT ON POOL 
    FOR EACH ROW
    BEGIN
        insert into CONTACT (nom, prenom,mdp, userdroit) 
        SELECT New.nom, 'test','test',1 FROM POOL;
    END;
    Cependant impossible de crée le trigger une erreur me bloque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >[Error] Script lines: 7-7 --------------------------
     ORA-00900: instruction SQL non valide
     Script line 7, statement line 1, column 0 
    Des explications ou aides à offrir que je puisse comprendre et avance ?

  2. #2
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 956
    Par défaut
    Bonsoir,

    ça va être compliqué

    Les contraintes déclaratives (null, check, PK, FK) sont évaluées AVANT les triggers.
    Donc, c'est mort.
    Il vaut mieux faire une procédure qui tente de faire l'ajout et sur erreur ajoute le contact et rejoue l'insert.

    Ensuite pour l'erreur :
    On a accès aux curseurs NEW et OLD à l'intérieur de d'un trigger FOR EACH ROW.
    Du coup New.nom est un scalaire qu'on va pouvoir utiliser unitairement ; pas exemple dans INSERT ... VALUES (New.nom);

    Le fait de requêter la table pour laquelle on fait le trigger n'est pas une bonne pratique.
    ... surtout sans clause WHERE !

  3. #3
    Membre Expert Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Par défaut

    2
    3
    4
    5
    6
    7
    CREATE OR REPLACE TRIGGER add_pool_contact
    BEFORE INSERT ON POOL
    FOR EACH ROW
    BEGIN
    insert into CONTACT (nom, prenom,mdp, userdroit)
    VALUES (:New.nom, 'test','test',1);
    END;

  4. #4
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 956
    Par défaut
    Citation Envoyé par Michel.Priori Voir le message
    Les contraintes déclaratives (null, check, PK, FK) sont évaluées AVANT les triggers.
    je répond à mon erreur : https://docs.oracle.com/cd/B19306_01...0/triggers.htm

    Oracle uses the following execution model to maintain the proper firing sequence of multiple triggers and constraint checking:
    ..Run all BEFORE statement triggers that apply to the statement.
    ..Loop for each row affected by the SQL statement.
    ......Run all BEFORE row triggers that apply to the statement.
    ......Lock and change row, and perform integrity constraint checking. (The lock is not released until the transaction is committed.)
    ......Run all AFTER row triggers that apply to the statement.
    ..Complete deferred integrity constraint checking.
    .. Run all AFTER statement triggers that apply to the statement.
    Donc conformément à la réponse de Garuda, il faut utiliser un trigger BEFORE et FOR EACH ROW pour bénéficier des curseurs NEW: et OLD:

    Et on est bien d'accord qu'il faille utiliser INSERT ... VALUES en lieu et place de INSERT ... SELECT

    NB: Je maintient que requêter la table pour le quel on crée le trigger est une mauvaise pratique.
    Vu que les -1 ne permettent pas de justifier la note, je suis ouvert à la conversation même en MP.

Discussions similaires

  1. Récupérer une valeur dans une JList
    Par Noosymer dans le forum Composants
    Réponses: 6
    Dernier message: 17/06/2010, 23h53
  2. [VBA-A] Récupérer une valeur dans une table Access
    Par Dude2006 dans le forum VBA Access
    Réponses: 1
    Dernier message: 15/04/2006, 23h56
  3. récupérer une valeur dans un selected
    Par lacfab dans le forum Langage
    Réponses: 6
    Dernier message: 14/12/2005, 09h48
  4. Réponses: 5
    Dernier message: 09/09/2005, 17h51
  5. problème pour récupérer une valeur dans ma bd (débutante)
    Par auryn111 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 26/08/2005, 17h49

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