Précédent   Forum du club des développeurs et IT Pro > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 12/12/2012, 14h16   #1
gilles_906
Membre régulier
 
Homme Gilles
Inscription : août 2010
Messages : 261
Détails du profil
Informations personnelles :
Nom : Homme Gilles
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : août 2010
Messages : 261
Points : 83
Points : 83
Par défaut trigger pour supprimer les lignes d'une table

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 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
BEGIN
 INSERT INTO Tempo (RefClient, RefFacture, Utilisateur, DateRelance, Commentaires, DatePromessePayement) 
SELECT TFactures.RefClients, TFactures.RefFacture, tblRelanceProv.Utilisateur,
  NOW() AS DateRelance, tblRelanceProv.Commentaires, tblRelanceProv.DatePromise
FROM tblRelanceProv INNER JOIN
  TFactures ON TFactures.RefClients = tblRelanceProv.RefClient LEFT JOIN
  TRelance ON TRelance.RefFacture = TFactures.RefFacture
  WHERE 
( (TFactures.FactPaye = 0) AND (TRelance.DatePromessePayement < NOW()) OR (TFactures.FactPaye = 0) AND (TFactures.DateLimitePayement < NOW()) )
ORDER BY TFactures.RefClients LIMIT 1; 
 
-- Insertion de la table temporaire dans la Table TRelance
INSERT INTO TRelance (TRelance.RefFacture, TRelance.Utilisateur, TRelance.DateRelance, TRelance.Commentaires, TRelance.DatePromessePayement)
SELECT RefFacture, Utilisateur, DateRelance, Commentaires, DatePromessePayement
FROM Tempo;
 
DELETE FROM tblRelanceProv;
END
Merci d'avance
Gilles
gilles_906 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 19h18   #2
ericd69
Expert Confirmé
 
Avatar de ericd69
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 1 816
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 1 816
Points : 3 119
Points : 3 119
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...
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 19h21   #3
gilles_906
Membre régulier
 
Homme Gilles
Inscription : août 2010
Messages : 261
Détails du profil
Informations personnelles :
Nom : Homme Gilles
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : août 2010
Messages : 261
Points : 83
Points : 83
Salut

Merci de ta réponse

Non c'est un trigger qui se declenche lorsqu'une ligne est inséré.
gilles_906 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 19h33   #4
ericd69
Expert Confirmé
 
Avatar de ericd69
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 1 816
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 1 816
Points : 3 119
Points : 3 119
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...
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 21h09   #5
gilles_906
Membre régulier
 
Homme Gilles
Inscription : août 2010
Messages : 261
Détails du profil
Informations personnelles :
Nom : Homme Gilles
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : août 2010
Messages : 261
Points : 83
Points : 83
Il ne passe pas a cause de ca
Code :
DELETE FROM tblRelanceProv;
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 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
DROP TRIGGER IF EXISTS `trigger_MAJ_Relance`;
DELIMITER //
CREATE TRIGGER `trigger_MAJ_Relance` AFTER INSERT ON `tblRelanceProv`
 FOR EACH ROW BEGIN
 
    CREATE TEMPORARY TABLE IF NOT EXISTS Tempo (
	RefClient varchar (20) DEFAULT '',
	RefFacture varchar (20) DEFAULT '',
	Utilisateur varchar (20) DEFAULT '',
	DateRelance datetime,
	Commentaires varchar (100) DEFAULT '',
	DatePromessePayement datetime);
 
 INSERT INTO Tempo (RefClient, RefFacture, Utilisateur, DateRelance, Commentaires, DatePromessePayement) 
SELECT TFactures.RefClients, TFactures.RefFacture, tblRelanceProv.Utilisateur,
  NOW() AS DateRelance, tblRelanceProv.Commentaires, tblRelanceProv.DatePromise
FROM tblRelanceProv INNER JOIN
  TFactures ON TFactures.RefClients = tblRelanceProv.RefClient LEFT JOIN
  TRelance ON TRelance.RefFacture = TFactures.RefFacture
  WHERE 
( (TFactures.FactPaye = 0) AND (TRelance.DatePromessePayement < NOW()) OR (TFactures.FactPaye = 0) AND (TFactures.DateLimitePayement < NOW()) )
ORDER BY tblRelanceProv.DateRelance DESC LIMIT 1; 
-- Insertion de la table temporaire dans la Table TRelance
INSERT INTO TRelance (TRelance.RefFacture, TRelance.Utilisateur, TRelance.DateRelance, TRelance.Commentaires, TRelance.DatePromessePayement)
SELECT RefFacture, Utilisateur, DateRelance, Commentaires, DatePromessePayement
FROM Tempo;
 
DELETE FROM tblRelanceProv;
 
END
//
DELIMITER ;
gilles_906 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 21h22   #6
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 672
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 13 672
Points : 25 526
Points : 25 526
Envoyer un message via MSN à CinePhil
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 !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 06h22   #7
ericd69
Expert Confirmé
 
Avatar de ericd69
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 1 816
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 1 816
Points : 3 119
Points : 3 119
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...
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 08h26   #8
gilles_906
Membre régulier
 
Homme Gilles
Inscription : août 2010
Messages : 261
Détails du profil
Informations personnelles :
Nom : Homme Gilles
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : août 2010
Messages : 261
Points : 83
Points : 83
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
gilles_906 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 09h11   #9
ericd69
Expert Confirmé
 
Avatar de ericd69
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 1 816
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 1 816
Points : 3 119
Points : 3 119
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...
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 09h48   #10
gilles_906
Membre régulier
 
Homme Gilles
Inscription : août 2010
Messages : 261
Détails du profil
Informations personnelles :
Nom : Homme Gilles
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : août 2010
Messages : 261
Points : 83
Points : 83
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
gilles_906 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 10h54   #11
ericd69
Expert Confirmé
 
Avatar de ericd69
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 1 816
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 1 816
Points : 3 119
Points : 3 119
ça oui:
Citation:
Envoyé par gilles_906 Voir le message
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.
et en plus en terme de sécurité n'appeler que des procédures stocker permet d'utiliser un utilisateur avec seulement "grant execute" sur la bd et qui peut même n'avoir aucun mot de passe

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...
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2012, 15h54   #12
gilles_906
Membre régulier
 
Homme Gilles
Inscription : août 2010
Messages : 261
Détails du profil
Informations personnelles :
Nom : Homme Gilles
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : août 2010
Messages : 261
Points : 83
Points : 83
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 car l'appli ne sera pas diffusé)
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
gilles_906 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 11h11.


 
 
 
 
Partenaires

Hébergement Web