|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre régulier
![]() Gilles Inscription : août 2010 Messages : 261 ![]() |
Bonjour
j'ai fais un trigger qui after insert rempli une table. Ensuite j'aimerai que le trigger vide la table qui a recu l'enregitrement. Comme c'est celle qui contient le trigger => ca plante en me disant que la table est occupé par le trigger Auriez vous une idée de comment faire? voici mon code Code :
Gilles |
||
|
|
00
|
|
|
#2 |
|
Expert Confirmé
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 1 816 ![]() |
salut,
c'est une procédure stockée ton truc que tu veux faire pas un trigger...!?
__________________
soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...
|
|
|
00
|
|
|
#3 |
|
Membre régulier
![]() Gilles Inscription : août 2010 Messages : 261 ![]() |
Salut
Merci de ta réponse Non c'est un trigger qui se declenche lorsqu'une ligne est inséré. |
|
|
00
|
|
|
#4 |
|
Expert Confirmé
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 1 816 ![]() |
le problème c'est que tu n'as pas bien compris le but d'un trigger...
et ton code ressemble plus à celui d'une procédure montre l'entete de ton trigger... il ne passe pas si tu fais une "référence circulaire" à la table avec un de tes requête dedans...
__________________
soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...
|
|
|
00
|
|
|
#5 | ||
|
Membre régulier
![]() Gilles Inscription : août 2010 Messages : 261 ![]() |
Il ne passe pas a cause de ca
Les triggers ne pouvant enlever un enregistrement sur la table sur laquelle ils sont (enfin d'aprés ce que j'ai compris) voila le code complet Code :
|
||
|
|
00
|
|
|
#6 |
![]() ![]() |
Dans ce cas, il vaut mieux faire une procédure.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise la suite Linux Mageïa ! |
|
00
|
|
|
#7 |
|
Expert Confirmé
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 1 816 ![]() |
oui car ça fait une référence circulaire, tu peux pas faire d'insert, update, delete dans trigger sur la table sur laquelle il porte, c'est logique... par contre tu peux le faire sur n'importe quelle autre
![]() tu dois passer par une procédure stockée qui fera les différentes actions dont l'insertion qui déclenchait ton trigger que tu appelleras du coup à la place de l'insertion
__________________
soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...
|
|
|
00
|
|
|
#8 |
|
Membre régulier
![]() Gilles Inscription : août 2010 Messages : 261 ![]() |
Merci de vos réponse.
C'est un fichier php qui insert l'enregistrement. Je ne comprends pas bien ce que vous voulez que je fasse avec une procédure stocké. Je vais vous expliquez toute la fonction. Depuis un téléphone android j'envoie 4 Informations dans un php. ces 4 info sont envoyé dans la table provisoire tblRelanceProv. Des qu'une ligne est ajouté dans la tblRelanceProv, je veux qu'une autre table (beaucoup plus complexe soit rempli). Ensuite je veux vider la table Provisoire tblRelanceProv Donc je fais: a l'arrivé d'une nouvelle ligne (donc dans un trigger, les PS ne pouvant rien détecter) => je récupére certaines informations qui se trouve dans d'autre tables pour recrée la table compliqué. En resumé: Trigger qui se declenche a l'arrivé d'une info dans la table Procedure stocké qui va alimenter la table compliqué Alors oui j'aurais pu ne mettre dans le trigger que le lancement de la SP, mais je n'y trouve aucun interet sauf a vérouiller la table tblRelanceProv durant tout le temps de traitement de la PS, sachant qu'elle est aussi activé par d'autre éléments. J'espere avoir été clair. J'ai palié a ce manque de mysql en faisant un evenement qui va vider la table, mais je trouve ca pas terrible du tout. C'est pour ca que je demandais s'il y avait une autre facon de faire. Merci de m'avoir lu jusqu'au bout. Gilles |
|
|
00
|
|
|
#9 |
|
Expert Confirmé
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 1 816 ![]() |
c'est normal que tu ne puisse pas faire d'action sur la même table autrement tu déclencherais de potentiels autre triggers qui pourraient eux même faire des actions sur la table et donc redéclencher le trigger initial ce qui ferait une boucle sans fin jusqu'au plantage par "segmentation fault", c'est un exemple de ce qu'on appelle une référence circulaire: toute action qui engendre une boucle sans fin ou des appels de fonction jusqu'à saturation de la mémoire.
déjà est ce que la table temporaire est bien nécessaire? modélisation de la bd bien pensé? si oui à tout ça, ton php peut faire un "call" sur la procédure qui prend en paramètre les valeurs que tu passais à ton insert originel et fait les traitements en interne sais tu que tu as le droit à des variables en procédural ainsi qu'à toutes les instructions de rupture de code classique? ça doit pouvoir permettre de gérer ta problématique non et ce sans passer forcément par une table temporaire? bref faut voir le besoin réel...
__________________
soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...
|
|
|
00
|
|
|
#10 |
|
Membre régulier
![]() Gilles Inscription : août 2010 Messages : 261 ![]() |
Disons que je ne voie pas d'autre facon de faire, meme s'il doit surement il y en avoir.
la Table que l'on va appeler TAndroid (c'est celle qui doit etre rempli au final et qui sert a allimenter en infos le téléphone) Est actuellement rempli a l'aide d'une procedure stocké. Cette procedure fait: récupérer dans differentes tables pleins d'infos Fait un mixte de ces infos pour en créer d'autres. Les places dans TAndroid Cette procedure est appelé a partir du client final (soit mon ordi, lorsque je fais un changement sur une des tables) Elle doit également etre appellé des que l'on rajoute une info depuis le téléphone dans la table temporaire. La table temporaire est necessaire (a mon avis) car: 4 infos proviennent de la tables temporaire. j'ai besoin pour remplir la table d'une 5eme infos qui se trouve dans une autre table et qui est le champ clé de la table finale. En gros, tu l'as compris c'est un systeme de relance: Soit a partir du téléphone, soit a partir de l'ordi: Le téléphone me renvoie la Reférence du client de la, je dois aller récupérer toutes les factures du client qui ne sont pas réglé et leur affecter la relance, il me faut donc toutes les Références de factures correspondante. Ensuite je mets a jour la table "d'alimentation" d'Android. En suivant ton idée j'aurais: un php qui recoit les 4 infos Une procedure appellé par le php, qui une fois qu'elle aura récupéré la 5ème info remplira ma table de relance puis ira déclencher la procedure de mise a jour de la TAndroid. ou Gestion dans le php de la récupération de la 5eme info et écriture direct dans la table finale puis mise a jour par la procedure de la TAndroid Ca me plait bien, cela fait beaucoup plus propre que ce que j'ai fais (meme si ca marche actuellement) Merci du coup de main |
|
|
00
|
|
|
#11 | |
|
Expert Confirmé
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 1 816 ![]() |
ça oui:
Citation:
car je rappelle que ton application est facilement récupérable pour faire du reverse engineering... donc d'avoir l'utilisateur et le mot de passe
__________________
soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...
|
|
|
|
00
|
|
|
#12 |
|
Membre régulier
![]() Gilles Inscription : août 2010 Messages : 261 ![]() |
Bonjour
J'ai refais le php suivant ton idée et tout fonctionne très bien, je n'ai plus de trigger ![]() Par contre pour le reverse engineering (hormis le fait qu'il faudrait que le mec me vol le portable et qu'en plus il soit capable de faire du reverse engineering Le seul mot de passe qu'il récupére dans tout les cas sera celui du htaccess du dossier dans lequel ce trouve les php et ce n'est pas le meme que celui pour se connecter au serveur ou a la base. Merci encore pour les conseils Gilles |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com