IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Trigger qui vérifie inscription à un groupe


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 3
    Par défaut Trigger qui vérifie inscription à un groupe
    Bonjour, je souhaite créer un Trigger en SQL qui vérifie le nombre d'inscription maximal à un groupe précis(dans mon exemple, le maximum par groupe est de 4).

    Voici le code qui pose problème, car je peux entrer autant de membre que je veux dans un groupe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TRIGGER trigger_maximum_inscription
    ON tbl_inscription
    FOR INSERT AS
    DECLARE @nb_membre int, @no_groupe int
    SELECT @nb_membre=COUNT(no_membre)
    FROM tbl_inscription
    WHERE no_groupe = @no_groupe
    IF (@nb_membre>3)
    	BEGIN
    		RAISERROR('Le nombre de maximal(4) pour ce groupe est atteint', 16, 1)
    		ROLLBACK
    	END
    Merci de m'aider.. J'essais plein de choses, et ça ne semble pas fonctionner :-(

    P.S. Ma table inscription contient 2 variables et clés primaires --> no_membre et no_groupe

  2. #2
    Futur Membre du Club
    Inscrit en
    Mars 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 3
    Par défaut
    J'ai fait quelques modifications qui semblent fonctionner, mais je ne suis pas certain que ce code soit performant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TRIGGER trigger_maximum_inscription
    	ON tbl_inscription
    	FOR INSERT AS
    	IF EXISTS(SELECT * FROM tbl_inscription
    		GROUP BY no_groupe
    		HAVING COUNT(*) > 4)
    	BEGIN
    		RAISERROR('Le nombre de maximal(4) pour ce groupe est atteint', 16, 1)
    		ROLLBACK
    	END
    GO

  3. #3
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Vous vérifiez toute la table...
    Ne vérifiez la règle que pour les données insérées (table inserted...).

    exemple: vous ajoutez une ligne, vous n'avez à vérifier la règle que pour le no_groupe appartenant à la ligne insérée.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    Ibersek à, raison, il faut faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE TRIGGER trigger_maximum_inscription
    ON tbl_inscription
    FOR INSERT AS
    IF EXISTS(SELECT * 
              FROM   tbl_inscription AS T
                     INNER JOIN inserted AS I
                           ON T.no_group = I.no_group
              GROUP BY no_groupe
              HAVING COUNT(*) > 4)
    BEGIN
       RAISERROR('Le nombre de maximal(4) pour ce groupe est atteint', 16, 1);
       ROLLBACK;
    END
    GO
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE TRIGGER trigger_maximum_inscription
    ON tbl_inscription
    FOR INSERT AS
    IF EXISTS(SELECT * 
              FROM   tbl_inscription AS T
                     INNER JOIN inserted AS I
                           ON T.no_group = I.no_group
              GROUP BY no_groupe
              HAVING COUNT(*) > 4)
    BEGIN
       RAISERROR('Le nombre de maximal(4) pour ce groupe est atteint', 16, 1);
       ROLLBACK;
    END
    GO

    Euh... cette syntaxe ne fonctionnera pas sous SQL SERVER, il faut préciser dans le select:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TRIGGER trigger_maximum_inscription
    ON tbl_inscription
    FOR INSERT AS
    IF EXISTS(SELECT I.no_groupe
              FROM   tbl_inscription AS T
                     INNER JOIN inserted AS I
                           ON T.no_group = I.no_group
              GROUP BY I.no_groupe
              HAVING COUNT(*) > 4)
    BEGIN
       RAISERROR('Le nombre de maximal(4) pour ce groupe est atteint', 16, 1);
       ROLLBACK;
    END

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Citation Envoyé par iberserk Voir le message
    Euh... cette syntaxe ne fonctionnera pas sous SQL SERVER, il faut préciser dans le select:
    Ha bon... pourquoi ?

    En effet, je pense qu'il faut préciser l'alias pour le GROUP BY et puis écrire no_groupe partout...

    Mais le "SELECT *" me semble tout à fait correct ?

Discussions similaires

  1. Trigger qui vérifie l'insertion en base
    Par wapette21 dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 21/10/2010, 10h08
  2. Trigger qui vérifie l'existence de fichiers
    Par roman67 dans le forum SQL
    Réponses: 22
    Dernier message: 10/02/2010, 10h37
  3. Site qui vérifie les actualisations d'une page web
    Par LFC dans le forum Autres langages pour le Web
    Réponses: 4
    Dernier message: 01/12/2005, 18h47
  4. [trigger] ... qui ne se déclenche pas
    Par bozo dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 14/01/2004, 11h31
  5. Réponses: 5
    Dernier message: 25/11/2003, 09h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo