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

Oracle Discussion :

Simple Trigger before on insert.


Sujet :

Oracle

  1. #1
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 197
    Points : 64
    Points
    64
    Par défaut Simple Trigger before on insert.
    Bonjour,

    J'ai un petit soucis.

    Je cherche a creer un trigger sous Oracle qui a pour but d'effectuer une verification avant un INSERT sur la table BG_COURS_DATE

    Je souhaite effectuer l'INSERT uniquement si la date de l'insert n'est pas deja dans la table BG_COURS_DATE.

    CREATE OR REPLACE TRIGGER check_cours_date
    BEFORE INSERT ON BG_COURS_DATE

    SELECT COUNT(DATE) FROM BG_COURS_DATE WHERE DATE=:NEW.DATE

    SI COUNT(DATE) = 0 ALORS RESULT = TRUE (On effectue l'insert)
    SINON RESULT = FALSE;

    END;

    Je sais pas trop comment traduire ca. Si qqu a une idée ?

    MERCI de votre aide.

  2. #2
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Il suffit de créer un UNIQUE INDEX sur la colonne en question.
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  3. #3
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 197
    Points : 64
    Points
    64
    Par défaut
    Re,

    Il y a pas moyen qu'a partir du trigger, verifier par une requete si la date est deja presente. Si OUI on bloque le INSERT qui a été demandé et qui a appellé le trigger (Before on insert) Sinon on laisse passer le insert ?

    J'avais tenté de faire ca mais je sais pas quoi mettre dans le IF.

    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
    CREATE OR REPLACE TRIGGER check_cours_date
    BEFORE INSERT ON BG_COURS_DATE
     
    DECLARE
    total INTEGER;
    BEGIN
     
    SELECT COUNT(DATE) INTO total FROM BG_COURS_DATE WHERE DATE=:NEW.DATE
     
    IF total=0 THEN
     
    ELSE
     
    END IF;
     
    END;

  4. #4
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Pour empêcher un trigger d'aller jusqu'au bout, il faut générer une exception.
    Par exemple, une instruction RAISE_APPLICATION_ERROR( -20001,'le message d'erreur' ) ;
    N'oubliez pas qu'un trigger s'exécute pendant la phase de validation (COMMIT)
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  5. #5
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 197
    Points : 64
    Points
    64
    Par défaut
    Donc ca devrait donner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     CREATE OR REPLACE TRIGGER check_cours_date
    BEFORE INSERT ON BG_COURS_DATE
     
    DECLARE
    total INTEGER;
    BEGIN
     
    SELECT COUNT(DATE) INTO total FROM BG_COURS_DATE WHERE DATE=:NEW.DATE
     
    IF total>0 THEN
    RAISE_APPLICATION_ERROR( -20001,'le message d'erreur' ) ;
    END IF;
     
    END;
    non ?

  6. #6
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Oui.
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  7. #7
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 197
    Points : 64
    Points
    64
    Par défaut
    J'ai donc fait ca :

    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
    CREATE OR REPLACE TRIGGER check_cours_date
    BEFORE INSERT ON BG_COURS_DATE
     
    DECLARE
    total INTEGER;
    BEGIN
     
    SELECT COUNT(COURS_DATE) INTO total FROM BG_COURS_DATE WHERE DATE=:NEW.COURS_DATE;
     
    IF total>0 THEN
    RAISE_APPLICATION_ERROR( -20001,'Erreur' ) ;
    END IF;
     
    END;
    /
    show errors;
    Oracle me répond :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    BEFORE INSERT ON BG_COURS_DATE
                      *
    ERREUR à la ligne 2 :
    ORA-04082: références NEW ou OLD interdites dans déclencheurs niveau table
     
     
    Pas d'erreur.
    Une idée ? Lerci de votre aide.
    Je cherche a recuperer la valeur de COURS_DATE qui cherche a être inserée.

  8. #8
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE OR REPLACE TRIGGER check_cours_date
    BEFORE INSERT ON BG_COURS_DATE
    FOR EACH ROW
    Mais je ne sais pas pourquoi tu ne veux pas d'un index unique sur COURS_DATE qui fait exactement cela, d'autant plus que pour que le trigger ne pose pas de problème de performance, il faudra créer un index sur COURS_DATE...

    Est-ce normal que DATE=:NEW.COURS_DATE, est-ce que cela ne devrait pas être COURS_DATE=:NEW.COURS_DATE.
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

Discussions similaires

  1. Trigger Before Insert et Before Update
    Par NicoNours dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 14/08/2007, 10h20
  2. Trigger : Before insert
    Par guitou0 dans le forum Développement
    Réponses: 6
    Dernier message: 29/06/2007, 11h39
  3. Trigger Before Insert
    Par Fred_ET dans le forum Administration
    Réponses: 7
    Dernier message: 22/11/2006, 00h29
  4. [Trigger] -recursivité before|after insert
    Par jacquesh dans le forum Oracle
    Réponses: 3
    Dernier message: 24/11/2005, 15h10
  5. Créer un trigger "before insert" avec SQL Server
    Par bubi dans le forum Développement
    Réponses: 2
    Dernier message: 14/11/2005, 10h12

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