Les triggers: tester si les insertions n'ont pas dépassé une limite

Les triggers: tester si les insertions n'ont pas dépassé une limite - SQL/NoSQL - Programmation

Marsh Posté le 19-03-2011 à 23:35:37    

Bonsoir!
 
Je fait appel à vous car j'ai un problème avec les triggers...
 
Voila, je suis en train de créer une base de données avec Oracle ( Dans le cadre d'un projet , je suis étudiant)  et je bloque sur une chose!
Le sujet : Des client qui s'inscrivent et participent à des activités, Il y a d'autres élement mais qui n'on pas de rapport avec mon problème. Je vous donne l’essentiel.  
J'aimerai créer un trigger qui me permet de tester si l'inscription d'un client à une activité est possible car cela dépend du nombre de places disponible par activité.
 
ainsi, si le nombre de places maximum est atteint, l'inscription sera annulée.  
 
voila se que j'ai fait:
 
1. les tables
J'ai une table client (id client, nom, adresse...)
une table activités (code_activite, designation, date, nb_places_max)
Inscrit_activité(id_client,code_activite,date_inscription)
 
Le trigger que j'ai essayer et le suivant (Il ne marche pas et j'ignore pour quoi :S)
 
CREATE TRIGGER TEST BEFORE INSERT ON INSCRIT_ACTIVITE
FOR EACH ROW
 
DECLARE &a
 
set &a = select count id_client from inscrit_activite
if &a< select (nb_place_max from activite where code_activite='1' ) -- Le code est un exemple, en gros c'est le code de l'activité voulu
 
begin
 
insert into inscrit_activite values (:new.id_client,:new.code_activite,:new.date)
end
 
go

 
Merci de m'aider, Soyez gentil en ce qui concerne les éventuelles erreurs de syntaxe: Je suis un vrai débutant!

Reply

Marsh Posté le 19-03-2011 à 23:35:37   

Reply

Marsh Posté le 03-04-2011 à 21:34:09    

Salut,

 

Alors d'abord, du côté syntaxe, le :
declare &a
me semble ne pas coller à la syntaxe du PL/SQL.
D'ailleurs, quand je lis ton code, la syntaxe me semble être celle du Transac SQL...

 

Ensuite, le truc, c'est que tu es dans un trigger qui se déclenche AVANT la mise à jour. En gros, dis-toi que si tu n'agis pas (notamment en levant une erreur) avant la fin du trigger, l'insertion se passera une fois le trigger exécuté.
Donc inutile d'ajouter l'insertion des données, puisque ton trigger justement s'est déclenché parce que tu étais en train d'insérer ces données. Il faut juste vérifier qu'il est possible de s'inscrire, et lever une erreur si ce n'est pas le cas.

 

Bon, j'ai la flemme de vérifier ma syntaxe, mais ça devrait ressembler à ça :

 

CREATE TRIGGER TEST BEFORE INSERT ON INSCRIT_ACTIVITE
FOR EACH ROW
referencing old as old new as new
DECLARE
    l_dummy integer;
    l_dummy2 integer;
BEGIN
 select count(*)
 into l_dummy
 from inscrit_activite;

 

select nb_place_max
into l_dummy2
from activite
where code_activite='1' ;

 

if l_dummy >= l_dummy2 then
       raise_application_error(-20000, 'Trop d''inscrits a cette activite. Game Over');
 end if;
end;

 

Sachant que ce code n'est pas tellement robuste si 2 personnes (ou plus) s'inscrivent en même temps pour une activité pour laquelle il reste une seule place disponible. mais ça, c'est une autre histoire...


Message édité par john cleese le 06-04-2011 à 21:05:41

---------------
Je poste peu, mais c’est parce que je réfléchis beaucoup avant de poster. Ce qui n'empêche pas que la plupart de mes interventions sont navrantes. Mais j’en suis fier.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed