Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL > Requêtes
Requêtes Forum d'entraide sur les requêtes SQL spécifiques à PostgreSQL, les triggers, les vues, etc.
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 17/01/2011, 12h19   #1
Candidat au titre de Membre du Club
 
ben gr
Inscription : octobre 2010
Messages : 49
Détails du profil
Informations personnelles :
Nom : ben gr

Informations forums :
Inscription : octobre 2010
Messages : 49
Points : 10
Points : 10
Par défaut Trigger pour vider une table avant insertion

Bonjour,

Je souhaiterais que lors du premier INSERT ou UPDATE de ma table 'test_trigger', le contenu de celle-ci soit effacé.

Je m'explique sur l'illogisme de ce trigger. J'utilise geoconcept (un logiciel de cartographie) qui exporte des données vers une base postgresql/postgis de sorte que ces données exportés puisse être utiliser dans une autre application.
Cependant Geoconcept agit avec postgresl que par insert ou update.

Ce qui me pose le problème suivant :lorsque je supprime une donnée de geoconcept, celle n'est pas supprimé dans la base postgresl (puisqu'il n'y a que des insertion et des mises à jour mais il ne supprime rien de la base).

Afin de pallier à ce problème, je souhaitais vider ma table avant le premier INSERT ou UPDATE pour que Geoconcept n'ait qu'à insérer l'ensemble des données.

Pour cela j'ai crée le trigger suivant

Code :
1
2
3
4
5
6
7
8
9
10
11
CREATE FUNCTION vider_table() RETURNS TRIGGER AS $suppression$
BEGIN 
   TRUNCATE TABLE test_trigger;
END;
$suppression$ LANGUAGE plpgsql;
 
CREATE TRIGGER suppression 
BEFORE INSERT OR UPDATE OR DELETE
	ON test_trigger 
	FOR EACH STATEMENT 
	EXECUTE PROCEDURE vider_table();
mais il me renvoie l'erreur suivante aprés un 'insert into' (testé en requête SQL directement, sans utiliser geoconcept)

Code :
1
2
3
ERROR:  cannot TRUNCATE "test_trigger" because it IS being used BY active queries IN this session
CONTEXT:  SQL statement "TRUNCATE TABLE test_trigger"
PL/pgSQL FUNCTION "vider_table" line 2 at SQL statement
Que pensez-vous de ma logique? Voyez-vous une autre solution qu'un trigger, ou celui est-il à paramétrer différemment?

Par avance merci,
renardchan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2011, 13h54   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 987
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 987
Points : 18 235
Points : 18 235
Envoyer un message via MSN à CinePhil
TRUNCATE supprime la table.
Si tu veux vider la table, il faut utiliser DELETE :
Code :
1
2
-- Supprime toutes les lignes de la table
DELETE FROM la_table
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2011, 14h26   #3
Candidat au titre de Membre du Club
 
ben gr
Inscription : octobre 2010
Messages : 49
Détails du profil
Informations personnelles :
Nom : ben gr

Informations forums :
Inscription : octobre 2010
Messages : 49
Points : 10
Points : 10
Je pensais que TRUNCATE pouvait faire l'affaire, en effet la documentation postgresql indique
Code :
La commande TRUNCATE supprime rapidement toutes les lignes d'un ensemble de tables. Elle a le même effet qu'un DELETE non qualifié sur chaque TABLE, mais comme elle ne parcourt par la TABLE, elle est plus rapide. De plus, elle récupère immédiatement l'espace disque, évitant ainsi une opération VACUUM. Cette commande est particulièrement utile pour les tables volumineuses.
J'ai toutefois essayé avec DELETE FROM mais il me renvoie l'erreur suivante

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ERROR:  stack depth LIMIT exceeded
HINT:  Increase the configuration parameter "max_stack_depth", after ensuring the platform's stack depth limit is adequate.
CONTEXT:  SQL statement "DELETE FROM test_trigger"
PL/pgSQL function "vider_table" line 2 at SQL statement
SQL statement "DELETE FROM test_trigger"
PL/pgSQL function "vider_table" line 2 at SQL statement
SQL statement "DELETE FROM test_trigger"
PL/pgSQL function "vider_table" line 2 at SQL statement
SQL statement "DELETE FROM test_trigger"
PL/pgSQL function "vider_table" line 2 at SQL statement
SQL statement "DELETE FROM test_trigger"
PL/pgSQL function "vider_table" line 2 at SQL statement
SQL statement "DELETE FROM test_trigger"
PL/pgSQL function "vider_table" line 2 at SQL statement
SQL statement "DELETE FROM test_trigger"
renardchan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2011, 15h06   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 987
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 987
Points : 18 235
Points : 18 235
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par renardchan Voir le message
Je pensais que TRUNCATE pouvait faire l'affaire, en effet la documentation postgresql indique
Code :
La commande TRUNCATE supprime rapidement toutes les lignes d'un ensemble de tables. Elle a le même effet qu'un DELETE non qualifié sur chaque TABLE, mais comme elle ne parcourt par la TABLE, elle est plus rapide. De plus, elle récupère immédiatement l'espace disque, évitant ainsi une opération VACUUM. Cette commande est particulièrement utile pour les tables volumineuses.
OK. Chez MySQL, TRUNCATE est implémenté en tant que destruction/création de table. Apparemment, chez Postgresql c'est différent.

Quant à l'erreur que tu as obtenue, je ne sais quoi te dire...
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2011, 15h41   #5
Membre Expert
 
Inscription : mars 2005
Messages : 1 565
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2005
Messages : 1 565
Points : 2 178
Points : 2 178
Votre message d'erreur est logique. Vous faites un trigger "ON DELETE" dans lequel vous faites un DELETE de la table en question. Vous amorcez une récursivité sans fin.

Et à la base l'approche est mauvaise car l'élément déclencheur de votre vidage de table ne peut être l'ajout de ligne (INSERT). En effet, il est très probable que l'ajout se fasse en plusieurs ordres INSERT.
vmolines est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h05.


 
 
 
 
Partenaires

Hébergement Web