Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème trigger insert

    17 mai 2022 à 19:49:18

    Bonjour, j'ai un problème avec un script sql

    Il fonctionne à 50% (j'ai aucune erreur)

    Je m'explique : J'ai un système de points sur mon site, si je modifie les points via le site ils apparaissent bel et bien dans la base de données, par contre si je les modifie directement sur la base de données ils vont pas sur le site, comme si que mon script ne faisait pas le travail que je lui demande

    Alors j'ai la réponse au problème mais pas vraiment, je viens ici car je m'y connais pas vraiment beaucoup en sql

    On me dis de remplacer cette partie de mon script par un Trigger Insert, sauf que je sais pas du tout comment faire

    J'ai regarder sur internet j'ai tout essayé et rien qui fonctionne..

    DROP TRIGGER IF EXISTS `after_playerpoints_points_update_playerpoints`|
    CREATE TRIGGER `after_playerpoints_points_update_playerpoints` AFTER UPDATE ON playerpoints_points FOR EACH ROW
    BEGIN
        
        -- Note : If player is registered and get in-game currency, update `users.money` "users = site tables
        IF EXISTS(SELECT users.name FROM users WHERE users.name = (SELECT playerpoints_username_cache.username FROM playerpoints_username_cache WHERE NEW.uuid = playerpoints_username_cache.uuid) ) THEN
            -- Note : check if values are different to prevent infinit loop
            IF (SELECT users.money FROM users WHERE users.name = (SELECT playerpoints_username_cache.username FROM playerpoints_username_cache WHERE NEW.uuid = playerpoints_username_cache.uuid) ) <> NEW.points THEN
                UPDATE users SET users.money = NEW.points WHERE users.name = (SELECT playerpoints_username_cache.username FROM playerpoints_username_cache WHERE NEW.uuid = playerpoints_username_cache.uuid);
            END IF;
    
        END IF;
           
    END|
    
    DROP TRIGGER IF EXISTS `after_users_update_playerpoints`|
    CREATE TRIGGER `after_users_update_playerpoints` AFTER UPDATE ON `users` FOR EACH ROW
    BEGIN
        
        -- Note : If player is registered and get web money, update his `tne_balances.balance`
        IF EXISTS(SELECT playerpoints_username_cache.username FROM playerpoints_username_cache WHERE playerpoints_username_cache.username = NEW.name)  THEN
        
            IF (SELECT playerpoints_points.points FROM playerpoints_points WHERE playerpoints_points.uuid = (SELECT playerpoints_username_cache.uuid FROM playerpoints_username_cache WHERE playerpoints_username_cache.username = NEW.name) ) <> NEW.money THEN
                UPDATE playerpoints_points SET playerpoints_points.points = NEW.money WHERE playerpoints_points.uuid = (SELECT playerpoints_username_cache.uuid FROM playerpoints_username_cache WHERE playerpoints_username_cache.username = NEW.name);
            END IF;
            
        END IF;
        
    END|

    J'espère que quelqu'un ici pourra résoudre mon problème !

    • Partager sur Facebook
    • Partager sur Twitter
      18 mai 2022 à 9:50:18

      Bonjour,

      Il est difficile de t'aider sans connaître ton contexte ...

      Mais avec ce que j'arrive à déduire de ton message, la mécanique mise en place me paraît maladroite voire inappropriée ...

      Es-tu prêt à remettre en cause ton modèle de données ? As-tu la main pour le faire ? Si oui peux-tu présenter un peu plus le fonctionnement associé à ces deux tables user et point ?

      Ou souhaites-tu juste prolonger la structure actuelle ?

      -
      Edité par Benzouye 18 mai 2022 à 9:50:53

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        18 mai 2022 à 11:52:32

        Bonjour,

        Alors en fait c'est pour Minecraft, il y a un plugin qui s'appelle playerpoints

        J'ai été voir le dév pour lui demander de quel façon fallait faire le script pour lier, il m'as expliqué j'ai réussi mais comme j'ai dis ça marche pas pour la fin du script

        Il m'a envoyé ce lien : https://github.com/Rosewood-Development/PlayerPoints/blob/master/src/main/java/org/black_ixx/playerpoints/manager/DataManager.java#L226

        C'est le code d'update de points pour voir le fonctionnement, j'y comprend absolument rien mais c'est du java ça me parait logique que je comprenne pas haha


        En fait je m'explique pour les tables


        users c'est la table de mon site, dedans il y les uuid/pseudo/money des utilisateurs

        playerpoints_points c'est la table du plugin, c'est à dire que techniquement le script est là pour lier cette table à la table users

        Donc quand j'ajoute des points à la table playerpoints_points ils doivent apparaitre dans users.money

        Si j'ajoute à la table users.money ça va bien dans playerpoints_points mais l'inverse ne fonctionne pas

        Je pense que c'est mieux expliqué !

        • Partager sur Facebook
        • Partager sur Twitter
          18 mai 2022 à 15:21:31

          Juste une remarque, plutôt importante à mes yeux, pourquoi ne pas avoir récupéré la colonne l'uuid de la table points comme clé primaire de ta table user ? Cela simplifierai énormément la chose ... C'est encore possible de modifier cela ?

          L'idée serait de faire ceci :

          • Vérifier le type de données de la colonnes playerpoints_points.uuid
          • Ajouter dans la table users une colonne uuid exactement du même type que celle de la table playerpoints_points
          • Lancer cette requête :
          UPDATE users U
          	INNER JOIN playerpoints_username_cache C
          		ON U.name = C.username
          SET U.uuid = C.uuid;

          Ensuite, concernant ton problème :

          Hanaé :) a écrit:

          Si j'ajoute à la table users.money ça va bien dans playerpoints_points mais l'inverse ne fonctionne pas

          Hanaé :) a écrit:

          On me dis de remplacer cette partie de mon script par un Trigger Insert

          Si on t'indique cela, c'est que ton problème se pose lorsque tu insères un nouvel enregistrement dans la table playerpoints_points.

          C'est à dire que tu fais une requête INSERT INTO playerpoints_points. C'est bien cela ?

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            18 mai 2022 à 16:14:42

            C'est pas vraiment possible faudrait que je remodifie tout mon script et j'ai terriblement pas envie :/

            Et yes je fais une requête insert into, c'est pour cette raison qu'il faut faire un trigger insert, mais j'y arrive pas du tout

            • Partager sur Facebook
            • Partager sur Twitter
              18 mai 2022 à 17:07:22

              Hanaé :) a écrit:

              C'est pas vraiment possible faudrait que je remodifie tout mon script et j'ai terriblement pas envie :/

              Je comprends, mais faire toutes tes jointures avec le username c'est vraiment dégeu ... mais bon, c'est toi le patron ...

              Hanaé :) a écrit:

              je fais une requête insert into

              Du coup le TRIGGER est quasiment identique ... il te faut juste modifier AFTER UPDATE en AFTER INSERT ...

              DELIMITER |
              DROP TRIGGER IF EXISTS `ai_points`|
              CREATE TRIGGER `ai_points`
              AFTER INSERT ON playerpoints_points
              FOR EACH ROW
              BEGIN
              	IF EXISTS(
              		SELECT users.name
              		FROM users
              		WHERE users.name = (
              			SELECT playerpoints_username_cache.username
              			FROM playerpoints_username_cache
              			WHERE NEW.uuid = playerpoints_username_cache.uuid
              		)
              	) THEN
              		IF (
              			SELECT users.money
              			FROM users
              			WHERE users.name = (
              				SELECT playerpoints_username_cache.username
              				FROM playerpoints_username_cache
              				WHERE NEW.uuid = playerpoints_username_cache.uuid
              			)
              		) <> NEW.points THEN
              			UPDATE users
              			SET users.money = NEW.points
              			WHERE users.name = (
              				SELECT playerpoints_username_cache.username
              				FROM playerpoints_username_cache
              				WHERE NEW.uuid = playerpoints_username_cache.uuid
              			);
              		END IF;
              	END IF;    
              END|
              DELIMITER ;

              Pour info, si tu fais la modification proposée pour ajouter uuid dans la table users, le code se simplifie :

              DELIMITER |
              DROP TRIGGER IF EXISTS `ai_points`|
              CREATE TRIGGER `ai_points`
              AFTER INSERT ON playerpoints_points
              FOR EACH ROW
              BEGIN
              	IF EXISTS(
              		SELECT 1
              		FROM users
              		WHERE users.uuid = NEW.uuid
              	) THEN
              		IF (
              			SELECT users.money
              			FROM users
              			WHERE users.uuid = NEW.uuid
              		) <> NEW.points THEN
              			UPDATE users
              			SET users.money = NEW.points
              			WHERE users.uuid = NEW.uuid;
              		END IF;
              	END IF;    
              END|
              DELIMITER ;

              -
              Edité par Benzouye 18 mai 2022 à 17:07:53

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                18 mai 2022 à 20:59:35

                ça fonctionne toujours pas :(

                Et d'ailleurs possible de m'expliquer le rapport entre l'uuid d'un joueur et les points? 

                La maintenant si j'update directement via la table playerpoints_points ça va bien dans users.money

                Mais si je fait via le jeu avec la commande ça envoie pas les points sur la table. Je vois avec le dév si ça vient pas directement de son plugin et si non je reviens ici 

                • Partager sur Facebook
                • Partager sur Twitter
                  20 mai 2022 à 9:53:02

                  L'uuid est l'identifiant unique du joueur.

                  Il est en général préférable d'utiliser ce type de données pour les contraintes référentielles (clés primaires et étrangères).

                  Dans ton cas cela permettrait surtout de ne pas avoir à faire des jointures "inutiles" ou de lourdes clauses WHERE.

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

                  Problème trigger insert

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  • Editeur
                  • Markdown