Mon premier TRIGGER

Moundir76 Messages postés 286 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014 - 10 janv. 2012 à 11:34
cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 - 30 sept. 2012 à 22:26
Bonjour,

NE savant pas utiliser Trigger, je me tourne vers Codes Sources afin d'obtenir des conseils.

Si je comprends bien, mon trigger va permettre de vérifier des conditions avant la modification d'une table de ma BDD. Le trigger pourra aussi exécuter du code selon le résultat renvoyé par ce même trigger. Arrêtez moi si je me trompe !

Dans un trigger on peut mettre des paramètres. "@nom et @prenom" dans mon exemple.

Ce que je souhaite faire : Quand via mon appli en VB.NET j'ajouter un utilisateur dans la table ENTITE, je souhaiterais que le trigger detecte le nom et le prénom saisi dans l'appli, afin qu'il vérifie si cette combinaison nom/prénom n'est pas déjà présente dans ma table.

Ainsi je pensais faire comme celà :
CREATE TRIGGER Trigger1
DECLARE @Nom varchar(50),
@Prenom varchar(50)
ON dbo.ENTITE 
FOR INSERT
as
IF SELECT nom, prenom from ENTITE WHERE nom=@Nom and prenom =@ 


Je voudrais savoir si ce serai une bonne solution, et je ne trouve pas comment continuer ma requête. "Si ma requête renvoie Vrai alors... Sinon exécuter l'insert"

Mon deuxième problème est : Comment, a partir de mon code en VB, exécuter ma requête en renseignant les paramètres pour le trigger, et surtout, exécuter le trigger !

Cordialement

4 réponses

cgandco Messages postés 219 Date d'inscription mercredi 26 octobre 2011 Statut Membre Dernière intervention 22 juin 2017 9
12 janv. 2012 à 12:49
Bonjour,

un trigger ne prend pas de paramètre et ne renvoie rien. un trigger s'execute automatiquement lors d'un insert, update ou delete (tu dois le définir).

Dans ton cas, utilise plutôt une procédure stockée qui accepte des paramètres et peut te renvoyer une valeur.

soit une procédure qui te renvoie le nombre d'enregistrement qui existe déja avec tes données et traite la condition en vb.

du genre

CREATE PROCEDURE IsExistUser @Nom varchar(50), @Prenom varchar(50)

SELECT nb = count(*) from ENTITE WHERE nom=@Nom and prenom =@prenom 



soit une procedure qui fait le tout (le test ici avant et l'insertion dans le cas ou nb = 0.

Bonne journée


Faites simple, aussi simple que possible, mais pas simpliste.
A. Einstein.
0
Moundir76 Messages postés 286 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
12 janv. 2012 à 14:20
Merci pour tes conseils cgandco
0
tri_yann Messages postés 124 Date d'inscription mercredi 23 novembre 2005 Statut Membre Dernière intervention 19 septembre 2013 3
16 avril 2012 à 21:34
Bonjour,

Ton trigger peut fonctionner. Il faut le finir par ROLLBACK TRAN si l'enregistrement ne doit pas être inséré.
DECLARE @Nom Varchar(255)
DECLARE @Prenom varchar(255)

Select @Nom Nom, @Prenom Prenom from inserted

IF EXISTS (Select * from [Entite] Where Nom = @Nom and Prenom = @Prenom)
ROLLBACK TRAN

Le plus simple est quand même de faire


INSERT INTO [Entite] (Nom, Prenom) 
SELECT A.* FROM
(SELECT @Nom as Nom, @Prenom as Prenom) A
left join 
(SELECT Nom, Prenom FROM [Entite] Where Nom = @Nom and Prenom = @Prenom) B
ON A.Prenom B.Prenom and A.Nom B.Nom
Where B.Nom is null


Et de lancer cette commande par le .Net en créant les paramètres @Nom et @Prenom. Aucune ligne ne sera insérée si la combinaison Nom / Prenom existe déjà et sans provoquer d'erreur.


Yann
0
cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 3
30 sept. 2012 à 22:26
Dans le cas présent je pense que le plus simple serait de créer un index unique sur les colones nom et prénom :

CREATE UNIQUE NONCLUSTERED INDEX IX_Entite_Nom_Prenom ON Entite(Nom, Prenom);


comme ça l'interdiction devient structurelle, elle ne contient pas de code donc moins de risque de bugs, elle est aussi vérifier si on cherche à modifier un nom ou un prénom(UPDATE).
0