Trigger débutant

Résolu
Signaler
Messages postés
286
Date d'inscription
dimanche 3 octobre 2010
Statut
Membre
Dernière intervention
16 mai 2014
-
Messages postés
286
Date d'inscription
dimanche 3 octobre 2010
Statut
Membre
Dernière intervention
16 mai 2014
-
Bonjour,

NE savant pas utiliser Trigger, je me tourne vers Codes Sources afin d'obtenir des conseils. (J'ai posté sur SQLFR mais je ne pense pas que ce soit finalement approprié)

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

10 réponses

Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
1 - risque d'injection SQL
2 - pas besoin de faire un SELECT nom, prenom, faire un SELECT COUNT(0)
3 - Pourquoi tester "0" et non un numérique ?
4 - Pourquoi faire ton .Close a cet endroit ?

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
Pourquoi vouloir forcément passer par un Trigger ?
N'est-ce pas plus simple de faire une requete... et de faire ton Insert si ton gus n'existe pas deja ?

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
286
Date d'inscription
dimanche 3 octobre 2010
Statut
Membre
Dernière intervention
16 mai 2014

Bonne remarque, mais c'était aussi pour essayer d'apprendre quelque chose de nouveau.

Je ne vois pas comment faire...

Peut être dans un premier temps faire une requete SELECT avec le nom et le prénom,
et apres je fais une condition

If MaCommande.ExecuteScalar <> 1 then
         Dim InsertUser as new SqlCommand "INSERT INTO.....................",Maconnexion
ELSE
messagebox.Show("ERREUR............")


Quelque chose comme ça ?
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
ca lève une exception, j'imagine...

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
286
Date d'inscription
dimanche 3 octobre 2010
Statut
Membre
Dernière intervention
16 mai 2014

Je fais comme celà :

   MaConnexion.Open()
                Dim CmdVerif As New SqlCommand("SELECT nom, prenom FROM ENTITE Where nom='" & Trim(txtNom.Text) & "' AND prenom='" & Trim(txtPrenom.Text) & "'", MaConnexion)

                If CmdVerif.ExecuteScalar <> 0 Then
                   'c'est que l'utilisateur existe déjà
                Else
                    'il n'existe pas
                End If
               

                MaConnexion.Close()


Ça a l'air de fonctionner
Messages postés
286
Date d'inscription
dimanche 3 octobre 2010
Statut
Membre
Dernière intervention
16 mai 2014

 MaConnexion.Open()
                Dim CmdVerif As New SqlCommand("SELECT nom, prenom FROM ENTITE Where nom='" & Trim(txtNom.Text) & "' AND prenom='" & Trim(txtPrenom.Text) & "'", MaConnexion)
                Dim varID As String = CmdVerif.ExecuteScalar().ToString
                If varID <> "0" Then
                    MaConnexion.Close()
                    MessageBox.Show("Attention, cet utilisateur " & txtPrenom.Text & "   " & txtNom.Text & ", existe déjà ! Modifier son nom ou prénom (ex : " & txtNom.Text & "2)")
                Else


Ça fait un peu bidoullage mais ça fonctionne bien !
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
Mieux de faire :

If CmdVerif.ExecuteNonQuery("INSERT ....") = 0 Then
   // Aucune ligne insérée
   MessageBox.Show("...")
End If


cf cette page


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
286
Date d'inscription
dimanche 3 octobre 2010
Statut
Membre
Dernière intervention
16 mai 2014

Merci pour le lien et les remarques, mais j'en reste au même souci, je veux vérifier une condition avant d'effectuer une insertion. Donc dans tous les cas je vais devoir faire un

SELECT COUNT(0) FROM ENTITE WHERE nom='" & txtNom.text & "' AND prenom='" & txtprenom.text &"' ....

Donc c'est sur, il y a un risque d'injection...

Mais merci pour l'astuce du count, je n'y avais pas pensé
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
vérifier une condtion avant le INSERT ?
fais confiance en ton Trigger et teste le nombre renvoyé par ExecuteNonQuery (nombre de lignes impactées)

si tu as 0, tu sais que ton Trigger a interdit l'insertion

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
286
Date d'inscription
dimanche 3 octobre 2010
Statut
Membre
Dernière intervention
16 mai 2014

Sauf que mon souci est que je n'arrive pas a créer mon trigger, et encore moins l'utiliser... C'est pour ça que j'avais posté. Donc si quelqu'un peut m'aidé par rapport à mon premier message, je suis intéressé, sinon je vais faire avec du SQL comme actuellement.

Merci Renfield