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.

  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)

  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.

  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.

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, 11h20
  2. Trigger : Before insert
    Par guitou0 dans le forum Développement
    Réponses: 6
    Dernier message: 29/06/2007, 12h39
  3. Trigger Before Insert
    Par Fred_ET dans le forum Administration
    Réponses: 7
    Dernier message: 22/11/2006, 01h29
  4. [Trigger] -recursivité before|after insert
    Par jacquesh dans le forum Oracle
    Réponses: 3
    Dernier message: 24/11/2005, 16h10
  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, 11h12

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