Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/05/2007, 15h13   #1
Futur Membre du Club
 
Inscription : avril 2007
Messages : 42
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 42
Points : 16
Points : 16
Par défaut Enregistrer une requête dans une table de Log

Bonjour,

J'essaye de créer une table de log dans ma base de données et j'aimerais pouvoir y stocker l'intitulé des requêtes qui modifie la base.

Pour exemple , voici ce que j'aimerais avoir dans ma table
Code :
1
2
3
4
5
6
7
+---------------------+-------+--------------------------------------------------------------------------+-------------+
| DATE                | TABLE | REQUETE                                                                  | COMMENTAIRE |
+---------------------+-------+--------------------------------------------------------------------------+-------------+
| 2007-05-21 14:59:25 | FAC   | 420                                                                      |             |
| 2007-05-21 15:09:47 | FAC   | INSERT FAC (SIRET,CCM,COMMUNE) VALUES
(NEW.SIRET,NEW.CCM,NEW.COMMUNE); | BLABLA      |
+---------------------+-------+--------------------------------------------------------------------------+-------------+
Je ne sais pas comment obtenir la colonne REQUETE automatiquement. J'arrive seulement à afficher le numéro de la ligne qui a été inséré.

Quelqu'un aurait-il une idée ?

Merci
cactus2078 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2007, 16h07   #2
Membre chevronné
 
Avatar de pop_up
 
Inscription : avril 2006
Messages : 833
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : avril 2006
Messages : 833
Points : 690
Points : 690
Si ça peut t'aider moi je traite ça directement dans le code

Aprés chaque INSERT, j'appelle une proc stockée que j'ai faite qui insere les données dans ma table de log.

En gros apres chaque insert il te suffit d'appeller ta proc stockée en y mettant les bonnes valeurs pour les differents champs.

tu vois ce que je veux dire ?
pop_up est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2007, 16h20   #3
Futur Membre du Club
 
Inscription : avril 2007
Messages : 42
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 42
Points : 16
Points : 16
Je ne vois pas vraiment ce que tu veux dire en fait.
Je n'ai jamais utilisé de procédure stockée et plus la requête que je dois stocker ne sera pas forcément un insert, ça peut être aussi bien delete ou update et ceux-ci sur plusieurs tables.

Sinon, tu aurais un exemple à me donner ? Voir un petit peu à quoi ça ressemble au niveau du code.

Merci
cactus2078 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2007, 16h32   #4
Membre chevronné
 
Avatar de pop_up
 
Inscription : avril 2006
Messages : 833
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : avril 2006
Messages : 833
Points : 690
Points : 690
si j'adapte ca a toi ca donnerai

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
DROP PROCEDURE IF EXISTS PRC_LOG;
 
CREATE PROCEDURE PRC_LOG (IN p_date DATE,
                                    IN p_table VARCHAR(255),
                                    IN p_requete TEXT, 
                                    IN p_com VARCHAR(255))
 
BEGIN
 
 
	INSERT INTO LOG(date, TABLE, requete, commentaire)
		VALUES (p_date, p_table, p_requete, p_com);
 
END;

et apres chaque requete que tu fais tu mets par exemple

CALL PRC_LOG(now(), ta table, ta requete, ton commentaire);


tu vois un peu mieux ce que je veux dire ?
pop_up est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2007, 09h35   #5
Futur Membre du Club
 
Inscription : avril 2007
Messages : 42
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 42
Points : 16
Points : 16
L'inconvénient c'est que ta méthode n'est pas automatique. Il faut appeler ta procédure après chaque requête, c'est pas très pratique.
Et étant donné que les gens qui vont utiliser la base ne s'y connaisse pas du tout en sgbd, ils vont pas penser à lancer la procédure.

L'idéal serait encore une fois que cela se fasse automatiquement à chaque requête qui modifie les tables. Par un trigger ce serait nickel mais je ne connais pas la méthode pour faire ce que je veux.

J'arrive juste à récupérer le numéro de l'enregistrement que j'ajoute , modifie et supprime.

Quelqu'un aurait-il une autre idée ?
cactus2078 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2007, 10h34   #6
Membre Expert
 
Avatar de Sivrît
 
Inscription : février 2006
Messages : 953
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2006
Messages : 953
Points : 1 189
Points : 1 189
Avec des triggers ça ne marchera que pour les UPDATE et INSERT, il en faudra 2 par table qui recontitueront les requêtes et ça va être moche.

Pour moi le plus simple... c'est d'activer le log général de MySQL, il donne toutes les requêtes Eventuellement le log binaire mais il n'y aura pas les SELECT.

Sinon pour avoir ça en base il faudrait faire une procédure/classe qui englobe les appels à la BDD et y ajoute la sauvegarde de la requête. Et forcer les développeurs à l'utiliser. Un simple grep sur le code devrait permettre de trouver les vilains qui accèdent directement à la BDD
Sivrît est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h07.


 
 
 
 
Partenaires

Hébergement Web