[SQL]trigger simple avant insertion

trigger simple avant insertion [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 19-07-2005 à 17:09:29    

je voudrai creer un trigger qui permet de verifier avant une insertion que la valeur que l'on veut rentrer dans un champ n'existe pas deja. et que ça ne permette pas l'insertion si c'est le cas...mais je ne vois pas comment faire une telle action!!

Reply

Marsh Posté le 19-07-2005 à 17:09:29   

Reply

Marsh Posté le 19-07-2005 à 17:14:40    

quel SGBD ?
 
généralement, on fait un truc du genre :
 
create trigger montrigger on matable
instead of insert
as
   declare @prout int
   select @prout = count(*) from matable where monchamp = inserted.monchamp
   if @prout = 0
   begin
      insert into matable (champs...) (select * from inserted)
   end
go

Reply

Marsh Posté le 19-07-2005 à 17:18:50    

pas besoin de faire un trigger pour cela, c'est inutile franchement.  
 
déjà si le champ est la primary key, cela est géré automatiquement, il est donc impossible d'insérer deux clés primaires identiques!
 
si cela porte sur un autre champ que la clé primaire, faut surtout pas faire un trigger, c'est allé poussé loin pour rien!
il te suffit de faire un contrainte unique sur le champ en question.
 
sous oracle ça donne:
 
ALTER TABLE matable ADD CONSTRAINT nomcontrainte UNIQUE (nomchamp);
 
je pense que ça doit etre comme cela! me souvient plus exactement de la synthaxe quand on rajoute une contrainte après création de la table!


Message édité par moi23372 le 19-07-2005 à 17:19:31
Reply

Marsh Posté le 19-07-2005 à 17:23:24    

sauf que si on veut pas que ça raise une erreur (mon trigger ne produit pas d'erreur, il dit juste "0 lignes insérées"

Reply

Marsh Posté le 19-07-2005 à 17:47:05    

sincerement moi je ne ferais pas avec un trigger! c'est vrai que ton trigger ne déclenchera aucune erreur! mais quand on réfléchis, si on a une application qui interagis avec la base de donnée, je prefère sincèrement récuperer une erreur afin de bien signaler que ça n'a pas été inséré. Puis franchement, pourquoi faire un trigger, quand quelque chose de tout fait existe?

Reply

Marsh Posté le 19-07-2005 à 19:17:03    

Ca dépend si tu fais de la gestion d'erreur "early bounding" ou "late bounding".
 
Pour faire une application dont on est sûr du déroulement en tout point, il faut impérativement faire du "early bounding", c'est à dire détecter les erreurs possible avant qu'elles ne se produisent.
 
Ceci dit, je ne renie aucunement le late bounding : je fais généralement un mix entre les deux, c'est à dire que pour les erreurs courrantes (saisir un code produit inexistant dans une commande, etc.) je fais du early bounding, c'est à dire qu'avant de tenter tout INSERT, je vérifie l'existance du produit, et pourquoi pas d'autres infos qu'une PK ne permet pas de vérifier, genre si le produit est en stock, mais pour des problèmes plus "système", genre perte de connection entre l'appli et le serveur web, je laisse le système faire ses erreurs, que je ne cherche généralement pas à trapper : ce sont des cas logiquement "impossibles", et de toute façon "irrécupérables".

Reply

Marsh Posté le 19-07-2005 à 19:23:31    

Sinon, pour le coup du trigger que j'ai fais, un exemple qu'une contrainte unique ne pourra pas vérifier :
 
-> J'ai une table "kitControl", "kitDetail" et une table "options"
 
Dans la table "kitControl", j'ai les champs :
 
kitControl
----------
OptionID
NbrMax
 
Dans la table "kitDetail", j'ai les champs :
 
kitDetail
---------
kitID
optionID
 
Option
---------
optionID
 
 
=> Dans la table kitControl j'ai les lignes ci-dessous :
 
KitID OptionID NbrMax
----- -------- ------
PC1   CM       1
PC1   RAM      2
PC1   HD       2
PC1   DVD      1
 
=> Dans la table KitDetail j'ai les lignes ci-dessous :
 
KitID  OptionID
------ --------
PC1    RAM
PC1    RAM
PC1    CM
PC1    HD
PC1    DVD
 
=> Je tente d'ajouter une ligne ('PC1', 'DVD') dans KitDetail
 
Ben avec une simple clé unique, je ne pourrai pas m'en sortir. Avec un trigger qui va vérifier que j'ai le droit d'avoir plus d'un DVD par kit "PC1", je pourrai traîter l'insertion sans problème.

Reply

Sujets relatifs:

Leave a Replay

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