trigger simple avant insertion [SQL] - SQL/NoSQL - Programmation
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
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!
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"
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?
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".
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.
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!!