Bonjour à tous,

Je suis pas du genre à déranger pr des questions plutot basiques mais la ca fait 3h que je cherche par tous les moyens de résoudre mon problème mais keutchi !

Voila mon histoire :
J'ai l'impression que lorsqu'on créait un trigger "for each row", ca sert pas à grand chose...
Je m'explique : j'ai créé un trigger sur une table INSCRIPTION (à un module). Et lors de la modification de cette table (insertion et modification uniquement), je vérifie que le nombre d'inscrit à ce module ne dépasse pas la limite autorisée (limite donné par le champs "effecmax" de la table MODULE).
Mais voila si j'ai opté pr l'option "for each row", c'était surtout pour faire des MAJ intelligentes mais apparament à partir du moment ou la condition 'nb d'inscrit >= effectif maximum' et que je lève un raise_application_error Oracle n'enregistre pas les mises à jour précedentes. Il annule tout...

Quelqu'un connaitrait un moyen pour ne pas annuler les MAJ qui précédement n'ont pas levé l'exeption ?
Ou alors une autre technique pour résoudre mon prob ?

Au fait, rien à voir, mais je comprends rien au numéro d'erreur lorsqu'on leve "application_error". J'ai choisi -20002 parce que mon prof avait mis ca mais je peux mettre n'importe quoi ??
Et je suis pas censé définir cette erreur quelque part ?

Merci d'avance...

Voia le code du trigger :
A noter que nb_inscrit() est une fonction calculant le nombre d'inscrits
au module à partir d'une table INSCRIPTION_BIS (table en mutation oblige)

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
 
CREATE OR REPLACE TRIGGER CHECK_PLACE_DISPONIBLE 
BEFORE INSERT OR UPDATE OF "CODMOD" ON "INSCRIPTION" 
FOR EACH ROW 
 
declare
 
nb_max NUMBER(3);
 
 
begin
 
 
select effecmax into nb_max from module where codmod = :new.codmod;
 
if (nb_max is not NULL) then 
 
 
       if (nb_inscrit(:new.codmod) >= nb_max) then
 
          raise_application_error(-20002, 'Opération impossible : les
                                  inscriptions à ce module ont atteint leur limite.');
 
 
       else
 
  	  UPDATE inscription 
                  SET  numetud = :new.numetud,  codmod = :new.codmod 
                  WHERE numetud = :old.numetud and codmod = :old.codmod;
 
 
       end if;
 
 
end if;
 
 
end;