Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2327 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL]trigger simple avant insertion

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[SQL]trigger simple avant insertion

n°1153923
albertos
kikoo
Posté le 19-07-2005 à 17:09:29  profilanswer
 

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!!

mood
Publicité
Posté le 19-07-2005 à 17:09:29  profilanswer
 

n°1153940
Arjuna
Aircraft Ident.: F-MBSD
Posté le 19-07-2005 à 17:14:40  profilanswer
 

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

n°1153948
moi23372
Posté le 19-07-2005 à 17:18:50  profilanswer
 

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
n°1153961
Arjuna
Aircraft Ident.: F-MBSD
Posté le 19-07-2005 à 17:23:24  profilanswer
 

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"

n°1153997
moi23372
Posté le 19-07-2005 à 17:47:05  profilanswer
 

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?

n°1154045
Arjuna
Aircraft Ident.: F-MBSD
Posté le 19-07-2005 à 19:17:03  profilanswer
 

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".

n°1154053
Arjuna
Aircraft Ident.: F-MBSD
Posté le 19-07-2005 à 19:23:31  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL]trigger simple avant insertion

 

Sujets relatifs
ACCESS requete SQL[résolu] vbs, html et insertion d'image
trigger et vérification de doublonsrequete SQL dans fonction JS
[VBA/Excel] Insertion de formules[Sql server] SUM sur un datetime
Doublons dans un affichage partiel d'un résultat SQL[Sql server] DISTINCT sur un DateTime
SQl Server variable type text , ntext[VBA EXCEL] fonction très simple qui renvoie #VALEUR...
Plus de sujets relatifs à : [SQL]trigger simple avant insertion


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR