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

SQL Oracle Discussion :

triggers sur nombre limité, répétition d'une action, champ limité


Sujet :

SQL Oracle

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Points : 4
    Points
    4
    Par défaut triggers sur nombre limité, répétition d'une action, champ limité
    Bonjour,
    Je voudrais créer un trigger qui calcule le nombre d'étudiants inscrits dans le nomod 'sy001'qui a un nombre limité d'effectifs (effecmax) sur la table module lors de l'inscription de l'étudiant sur la table inscription, en créant un compteur sur la table module et qui empêche aussi que l'on puisse baisser le nombre d'effectifs maximal par la suite mais mon compteur ne marche pas et je n'arrive pas à comprendre comment je peux le faire fonctionner ou comment contourner ce problème et le résoudre...
    Je voudrais aussi créer un trigger qui empêche qu'un étudiant puisse s'inscrire plus d'une fois à un même module mais ça ne marche pas non plus et je ne comprends pas l'erreur.
    Et un troisième trigger qui m'envoie un code d'erreur si je ne remplis pas le champ civilité de la table etudiant par 'MR' ou 'ME' ou 'MLE' (bref uniquement que par ces trois possibilités).
    Merci de m'aider à résoudre ces problèmes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    create table ETUDIANT(
    numetud number(10),
    nom varchar2(20),
    prenom varchar2(20),
    datenaiss date,
    civilite varchar2(5),
    patronyme  varchar2(20),
    numinsee char(13),
    adresse varchar2(100)
    );

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    insert into ETUDIANT values(2000000001,'Matera','Emma','25/08/1992','MLE',NULL,2920811111112,'10 rue Jean Renoir, 75017 Paris');
    insert into ETUDIANT values(1000000002,'Fauchier','Quentin','18/05/1991','MR',NULL,1905111111113,'35 rue Georges Sand, 92392 Villeneuve');
    insert into ETUDIANT values(2000000003,'Marin','Juliette','31/12/1989','ME','Bateau',2891211111114,'5 place Rambrand, 75009 Paris');
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create table MODULE(
    codmod varchar2(10),
    nomod varchar2(30),
    effecmax number(2)
    );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    insert into MODULE values('bd001','Bases de donnees deb',NULL);
    insert into MODULE values('bd002','Bases de donnees avan',NULL);
    insert into MODULE values('sy001','Systeme d Information',5);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create table EXAMEN(
    codmod varchar2(10),
    codexam varchar2(10), 
    datexam date
    );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    create table  RESULTAT(
    numetud number(10),
    codmod varchar2(10),
    codexam varchar2(10),
    note number(4,2)
    );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create table INSCRIPTION(
    numetud number(10),
    codmod varchar2(10),
    datinsc date
    );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    insert into INSCRIPTION values(1000000000,'bd001','12/09/2008');
    insert into INSCRIPTION values(1000000000,'sy001','12/09/2008');
    insert into INSCRIPTION values(2000000003,'bd001','15/09/2008');
    insert into INSCRIPTION values(2000000003,'sy001','15/09/2008');
    insert into INSCRIPTION values(1000000001,'sy001','12/09/2008');
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create table PREREQUIS(
    codmod varchar2(10),
    codmodpreq varchar2(30), 
    notepreq number(4,2)
    );
    trigger TrigInsInscript, TrigDelInscript, TrigUpInscript pour limiter les inscriptions à l'effecmax

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    create or replace trigger TrigInsInscript
    before insert on inscription2
    for each row 
    when (new.codmod = 'sy001')
     
    declare 
    v_compteur module2.nbinscrits%type;
    v_nomod module2.nomod%type;
     
    begin 
     
    	select nbinscrits, nomod into v_compteur, v_nomod from module2
    	where codmod = :new.codmod;
     
    if (v_compteur<3) then
     
    	update module2 set nbinscrits = nbinscrits + 1 
    	where codmod = :new.codmod;
     
    else 
    	raise_application_error (-20110,'Le module'|| v_nomod ||'est limité à 2 inscriptions par an!');
     
    end if;
     
    exception 
    	when no_data_found then
    	raise_application_error (-20111,'Module'||:new.codmod||'inexistant');
     
    	when others then raise;
     
    end;
    /	
     
    create or replace trigger TrigDelInscript
    after delete on inscription2
    for each row 
    when (new.codmod = 'sy001')
     
    begin 
    	update module2 set nbinscrits = nbinscrits - 1 
    	where codmod = :old.codmod;
    end;
    /	
     
    create or replace trigger TrigUpInscript
    after update of codmod on inscription2
    for each row 
    when (new.codmod = 'sy001')
     
    declare 
    v_compteur module2.nbinscrits%type;
    v_nomod module2.nomod%type;
     
    begin 
     
    	select nbinscrits, nomod into v_compteur, v_nomod from module2
    	where codmod = :new.codmod;
     
    if (v_compteur<3) then
     
    	update module2 set nbinscrits = nbinscrits + 1 
    	where codmod = :new.codmod;
     
    	update module2 set nbinscrits = nbinscrits - 1 
    	where codmod = :old.codmod;
     
    else 
    	raise_application_error (-20112,'Le module'|| v_nomod ||'est limité à 2 inscriptions par an!');
     
    end if;
     
    exception 
    	when no_data_found then
    	raise_application_error (-20113,'Module'||:new.codmod||'inexistant');
     
    	when others then raise;
     
    end;
    /	
     
     
     
     
    create or replace trigger TrigDoubleInscript
    before insert  on inscription2
     
    declare 
    v_num inscription2.numetud%type;
    v_cod inscription2.codmod%type;
     
    begin
    select codmod, numetud into v_cod, v_num  from inscription2 where numetud = :new.numetud;
    if (codmod = :new.codmod) then
    raise_application_error (-20114,'Double inscription dans ce module'||:new.codmod);
    end;
    /	
     
    insert into INSCRIPTION2 values(1000000000,'bd001','12/09/2008');
     
     
     
    create or replace trigger TrigCivilite
    before insert  on etudiant2
     
    declare create or replace trigger TrigCivilite
    before insert  on etudiant2
     
    declare 
    v_civilite etudiant2.civilite%type;
     
     
    begin
    select civilite into v_civilite  from etudiant2;
    if (civilite<> 'MR' or civilite<> 'ME'  or civilite<> 'MLE' ) then
    raise_application_error (-20115,'Erreur dans civilite');
     
    end if;
    end;
    /	
    v_civilite etudiant2.civilite%type;
     
     
    begin
    select civilite into v_civilite  from etudiant2;
    if (v_civilite<> 'MR' or v_civilite<> 'ME'  or v_civilite<> 'MLE' ) then
    raise_application_error (-20115,'Erreur dans civilite');
     
    end if;
    end;
    /
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into ETUDIANT2 values(2000000099,'Barbosa','Ange','11/11/1983','MLE',NULL,2911211111101,'Gervais');

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 391
    Points
    18 391
    Par défaut
    Des triggers ? Il vous faut surtout des contraintes et des clefs.

  3. #3
    Membre expérimenté Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Points : 1 332
    Points
    1 332
    Par défaut
    Bonjour,

    en effet pas trop besoin de trigger, moins de code moins de bug pour paphraser un collegue !!


    Trigger = difficulté de maintenance .


    Regarder dans le tutoriel

    http://oracle.developpez.com/guide/a...age=Chap4#L4.2

    les constraintes check, contraintes primaires ,clé unique et contraintes referentielles .

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Bonsoir,
    J'ai posé mes contraintes (est-ce qu'il en manque?) : ça marche pour les 3 premières tables mais j'ai des erreurs pour le reste et je n'arrive pas à les comprendre. Je n'ai pas non plus bien compris la notion ON DELETE CASCADE ou ON DELETE SET NULL : on les met dans la table père, fils, ou les deux? Et par rapport au triggers que j'ai posés, ça ne marche toujours pas.
    Merci de m'aider à résoudre ces problèmes.

    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
    alter table etudiant2 add(
    	constraint pk_etudiant2 primary key (numetud),
    	constraint nn_nom check (nom is not null),
    	constraint nn_prenom check (prenom is not null),
    	constraint nn_datenaiss check (datenaiss is not null)
    	);
     
    alter table module2 add(
    	constraint pk_module2 primary key (codmod) 
    	);
     
     
     
    alter table examen2 add(
    	constraint pk_examen2 primary key(codmod,codexam),
    	constraint fk_examen2_cod_mod foreign key(codmod)
    	references module2 (codmod)
    	);
     
     
    alter table resultat2 add(
    	constraint pk_resultat2 primary key(numetud,codmod,codexam),
    	constraint fk_resultat2_num_etu foreign key(numetud)
    	references etudiant2 (numetud),
    	constraint fk_resultat2_cod_ex foreign key(codmod)
    	references examen2 (codmod) 
    	constraint fk_resultat2_codx_ex foreign key(codexam)
    	references examen2 (codexam) 
    	);
     
     
    alter table inscription2 add(
    	constraint pk_inscription2 primary key (numetud,codmod),
    	constraint fk_inscription2_num_etu foreign key (numetud) 
    	references etudiant2 (numetud) ,
    	constraint fk_inscription2_cod_mod foreign key(codmod) 
    	references module2 (codmod) 
    	);
     
    alter table prerequis2 add(
    	constraint pk_prerequis2 primary key(codmod,codmodpreq),
    	constraint fk_prerequis2_cod_mod foreign key(codmod)
    	references module2 (codmod) 
    	);

  5. #5
    Membre expérimenté Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Points : 1 332
    Points
    1 332
    Par défaut
    Citation Envoyé par aduacellulaire Voir le message
    Bonsoir,
    J'ai posé mes contraintes (est-ce qu'il en manque?) : ça marche pour les 3 premières tables mais j'ai des erreurs pour le reste et je n'arrive pas à les comprendre. Je n'ai pas non plus bien compris la notion ON DELETE CASCADE ou ON DELETE SET NULL : on les met dans la table père, fils, ou les deux? Et par rapport au triggers que j'ai posés, ça ne marche toujours pas.
    Merci de m'aider à résoudre ces problèmes.

    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
    alter table etudiant2 add(
    	constraint pk_etudiant2 primary key (numetud),
    	constraint nn_nom check (nom is not null),
    	constraint nn_prenom check (prenom is not null),
    	constraint nn_datenaiss check (datenaiss is not null)
    	);
     
    alter table module2 add(
    	constraint pk_module2 primary key (codmod) 
    	);
     
     
     
    alter table examen2 add(
    	constraint pk_examen2 primary key(codmod,codexam),
    	constraint fk_examen2_cod_mod foreign key(codmod)
    	references module2 (codmod)
    	);
     
     
    alter table resultat2 add(
    	constraint pk_resultat2 primary key(numetud,codmod,codexam),
    	constraint fk_resultat2_num_etu foreign key(numetud)
    	references etudiant2 (numetud),
    	constraint fk_resultat2_cod_ex foreign key(codmod)
    	references examen2 (codmod) 
    	constraint fk_resultat2_codx_ex foreign key(codexam)
    	references examen2 (codexam) 
    	);
     
     
    alter table inscription2 add(
    	constraint pk_inscription2 primary key (numetud,codmod),
    	constraint fk_inscription2_num_etu foreign key (numetud) 
    	references etudiant2 (numetud) ,
    	constraint fk_inscription2_cod_mod foreign key(codmod) 
    	references module2 (codmod) 
    	);
     
    alter table prerequis2 add(
    	constraint pk_prerequis2 primary key(codmod,codmodpreq),
    	constraint fk_prerequis2_cod_mod foreign key(codmod)
    	references module2 (codmod) 
    	);
    Bonjour ,

    Pour la table ETUDIANT
    tu peux faire quelquechose comme ca

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CREATE TABLE ETUDIANT
    (
    numetud number(10),
    nom varchar2(20),
    prenom varchar2(20),
    datenaiss date,
    civilite varchar2(5) ,
    patronyme varchar2(20),
    numinsee number(13),
    adresse varchar2(100),
    constraint PK_etudiant PRIMARY KEY (numetud) using index,
    constraint etd_ck check (civilite in ('MR','MLE','ME'))
    );

    Et un trigger en moins ...

    Pour le TRIGGER TrigInsInscript

    apparemment la table MODULE a une colonne EFFECMAX
    et tu utilises une autre dans le code ....

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/01/2013, 10h36
  2. Réponses: 4
    Dernier message: 03/10/2010, 11h30
  3. Réponses: 8
    Dernier message: 04/08/2010, 11h29
  4. revenir sur la page courante après une action
    Par Altenide dans le forum Struts 2
    Réponses: 8
    Dernier message: 08/04/2010, 11h41
  5. Nombre de répétitions dans une requête
    Par Superjuju92 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 30/04/2008, 00h17

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