Moundir76
Messages postés281Date d'inscriptiondimanche 3 octobre 2010StatutMembreDernière intervention16 mai 2014
-
10 janv. 2012 à 11:34
cs_Malkuth
Messages postés268Date d'inscriptionsamedi 22 février 2003StatutMembreDernière intervention24 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 !
tri_yann
Messages postés124Date d'inscriptionmercredi 23 novembre 2005StatutMembreDernière intervention19 septembre 20133 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.
cs_Malkuth
Messages postés268Date d'inscriptionsamedi 22 février 2003StatutMembreDernière intervention24 avril 20134 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).