Partage
  • Partager sur Facebook
  • Partager sur Twitter

Trigger ON DELETE MySQL

Sujet résolu
    12 juin 2010 à 17:52:11

    Bonjour !

    Pour un de mes projets, j'ai besoin de plusieurs triggers dont notamment un qui permet de supprimer un tuple d'une table fille après suppression d'un tuple sur la table mère.
    Je m'explique : j'ai des informations à conserver pour tout les utilisateurs de mon site Web, id, nom, prénom... et j'ai une table qui hérite de celle-ci, qui elle correspond aux administrateurs, et je conserve leur numéro personnel, entre autres.

    La table mère s'appelle USERS, et la table fille c'est USERS_ADMINISTRATORS.

    Voici le MLD :

    USERS(id, name, first_name, login, pwd)
    USERS_ADMINISTRATORS(id, mobile)

    Je souhaite mettre en place un trigger qui, lors de la suppression d'un utilisateur, supprime ses informations d'administrateur correspondant. Evidemment, le trigger ne peut fonctionner que si l'utilisateur supprimé est un administrateur.

    Je me lance dans les triggers et procédures stockées, j'aurais bien besoin d'aide sur le sujet.

    Merci bien !
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      12 juin 2010 à 18:21:06

      Tu as certainement placé des contraintes d'intégrité référentielles sur tes tables (clé étrangère).

      Sur la table USERS_ADMINISTRATORS il suffit d'ajouter à la clé étrangère (id) la propriété ON DELETE CASCADE, et lorsque tu supprimeras une ligne dans USERS, la suppression dans la table "enfant" sera automatique et transparente.

      Pas besoin de trigger pour ça.
      • Partager sur Facebook
      • Partager sur Twitter
        12 juin 2010 à 18:53:55

        Salut !

        Je te remercie de ta réponse, mais j'ai besoin impérativement d'un trigger sur ce cas là, car mon projet porte sur les triggers et procédures stockées, et c'est un projet pour mes exams :p

        J'ai vu plusieurs syntaxes sur le net mais bon, j'ai quand même du mal avec tout ça.
        • Partager sur Facebook
        • Partager sur Twitter
          12 juin 2010 à 19:22:40

          Tu ne peux pas trouver un autre trigger à faire ?

          Parce qu'être un prof et avoir à corriger ça, je me dis tout de suite que le type n'a pas pris le temps de rechercher adéquatement quand un simple ON DELETE CASCADE suffit...
          • Partager sur Facebook
          • Partager sur Twitter
            12 juin 2010 à 19:27:57

            Oui je peut très bien faire des triggers en INSERT, notamment pour éviter que deux logins soient identiques.

            Mais sur ce coup là, si le jury me demande qu'elle autre méthode je peut faire, je lui sors le ON DELETE CASCADE ! :D

            Je vais voir d'un peu plus près alors les triggers en INSERT...

            Merci !
            • Partager sur Facebook
            • Partager sur Twitter
              12 juin 2010 à 19:33:51

              Éviter que deux logins soient identiques : contrainte UNIQUE.

              Je ne sais pas quel est ton projet, mais si j'étais toi, je m'efforcerais de trouver un truc qui ne peut pas être résolu avec les fonctions de base d'un SGBDR.

              Je ne sais pas non plus quelles consignes t'ont été données, c'est à toi de voir.
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                12 juin 2010 à 19:46:16

                Fait un truck plus complexe, mais toutefois classique.

                Pilote(idPilote, nom)
                Vol(idVol, avion, dateDebut, dateFin)

                - trigger pour vérifier que 2 vols pour un pilote sont sur des plages horaires différentes.
                - trigger pour vérifier qu'un avion ne vole pas en même temps sur 2 vols avec plage horraire qui se chevauchent.

                Tu rajoutes une table avec les brevets de pilotes, et les avions.

                - trigger qui vérifie que le pilote a bien obtenu le brevet pour piloter cet avion.

                etc....

                J'ai fait ça sur SQL Server en BTS IG.
                • Partager sur Facebook
                • Partager sur Twitter
                  12 juin 2010 à 22:31:43

                  Tout d'abord je tiens à vous remercier pour vos conseils !

                  En fait, je dois à tout pris monter un projet avec quelques triggers et procédures stockées. Je susi également en BTS IG comme tu l'étais Cintre Sournois, je dois passer à l'oral aux PTI mercredi.

                  L'une de mes activités est un blog contenant des tutos, cours et articles sur le dev. Web et le Web Design. Ce blog possède une BDD avec des triggers et des procédures stockées, car cela fait partie des spécificités de cette activité par rapport à une autre.
                  C'est pour cela que malgré tes idées Fayden, je suis obliger de m'efforcer de trouver des triggers à présenter, j'aurais agis d'une autre manière sinon.

                  Je dois trouver une façon de faire avec une BDD contenant des utilisateurs, des admins, des articles, des commentaires d'articles, et une hiérarchie de catégories d'articles (high, medium, sub), exemple : Tutoriels => développement Web => AJAX
                  • Partager sur Facebook
                  • Partager sur Twitter
                    12 juin 2010 à 22:42:15

                    Articles et commentaires : trigger qui met à jour une colonne "Nombre d'articles" et "Nombre de commentaires" pour chaque personne.
                    Un trigger qui vérifie qu'un auteur n'a pas posté deux articles/commentaires trop rapidement (spam)

                    Je ne sais pas de combien tu en as besoin, tu peux peut-être regarder de ce côté. Ça me parait pas non plus très difficile à réaliser.
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      12 juin 2010 à 22:46:05

                      Franchement, je pense qu'avec MySQL tu t'es énormément limité.

                      Sur SQL Server, tu aurais fait une vue des utilisateurs (vue de jointure par dessus les tables, car tu as mis en place de l'héritage), avec insert, update, suppresion par la vue à l'aide de Trigger, t'aurais eu 20/20 en PTI.
                      Mais de toute façon c'est un peu tard :)

                      Sinon tu peux dire qu'un administrateur ne peux pas être en même temps utilisateur, et tu mets un trigger sur les deux tables pour vérifier cela.

                      Ou encore, l'utilisateur ne peux pas poster 2 commentaires d'affilé sur le même topic.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        12 juin 2010 à 23:08:11

                        Oui SQL Server aurait été un bon choix, on me l'a déjà conseillé mais trop tardivement hélas...
                        Après c'est pas bien grave, la soutenance de projet c'est très bien passée, j'ai de la marge :)

                        Je vais tenir compte de ces idées et je vais mettre en place quelque chose qui tient la route. Merci :D
                        • Partager sur Facebook
                        • Partager sur Twitter
                          14 juin 2010 à 11:32:47

                          Bon j'ai pondu ce genre de trigger qui met à jour un champ "nbComments" sur la table users pour définir le nombre de commentaires que l'utilisateur a inséré sur le blog.

                          C'est pas terrible mais je m'entraîne pour la syntaxe surtout, seulement MySQL me renvoie une erreur :

                          #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE @users_id int
                          DECLARE @nbCom int

                          SELECT @users_id = users_id FROM co' at line 7


                          Voici le trigger :

                          CREATE TRIGGER updateNbCom AFTER INSERT ON comments
                          FOR EACH
                          ROW BEGIN 
                          BEGIN IF( NEW.updateNbCom !=  "" ) 
                          THEN 
                          
                          DECLARE @users_id INT
                          DECLARE @nbCom INT
                          
                          SELECT @users_id = users_id
                          FROM comments
                          WHERE users_id LIKE NEW.updateNbCom
                          
                          SELECT @nbCom = COUNT( * ) 
                          FROM comments
                          WHERE users_id = @users_id 
                          
                          UPDATE users SET nbComments = @nbCom WHERE id = @users_id 
                          
                          END IF ;
                          END;
                          


                          Je vais m'arracher les cheveux et je vais dl SQL Server je pense avant qu'il ne soit trop tard :D
                          • Partager sur Facebook
                          • Partager sur Twitter
                            14 juin 2010 à 11:39:11

                            Je vais faire en toute modestie de la pub pour mon tuto sur les triggers... tu le trouveras sur ce site ;)
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              14 juin 2010 à 11:44:53

                              Met un point-virgule après chaque "requête"/"ligne":
                              DECLARE @nbCom INT;

                              De toute façon tu n'as pas besoin de variable pour faire un truck aussi simple.
                              Qu'est-ce que updateNbCom ?

                              Fais simplement:
                              UPDATE users SET nbComments = nbComments + 1 WHERE id = NEW.users_id
                              • Partager sur Facebook
                              • Partager sur Twitter
                                14 juin 2010 à 11:57:38

                                Oui pas bête ! Ça allège le trigger en effet cependant une nouvelle erreur s'affiche :

                                #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'END' at line 7

                                Voici le trigger 2.0 :


                                DELIMITER //
                                
                                CREATE TRIGGER updateNbCom BEFORE INSERT ON comments
                                FOR EACH ROW 
                                BEGIN 
                                
                                UPDATE users SET nbComments = nbComments + 1 WHERE id = NEW.users_id;
                                
                                END//
                                DELIMITER ;
                                


                                Pourtant je me suis inspiré du tuto de Lord Casque Noir...

                                EDIT
                                Non c'est bon ça marche maintenant, il me manquait un point virgule ! Merci pour votre aide je suis déjà un peu plus soulagé. Je vais faire du tuto de Lord mon fond d'écran de bureau :)
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  14 juin 2010 à 16:20:52

                                  LOL, au moins ce truc sert, cool.

                                  Au fait comme tu as pu le voir MySQL est très chiant sur la syntaxe des triggers et les messages d'erreur sont "très clairs"...
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    15 juin 2010 à 11:44:50

                                    Oui j'ai remarqué en effet :D

                                    SQL Server est quand même plus apte sur les triggers mais bon...
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Trigger ON DELETE MySQL

                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                    • Editeur
                                    • Markdown