IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

Trigger pour vider une table avant insertion


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 71
    Points : 57
    Points
    57
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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,

  2. #2
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 : 16 812
    Points : 34 084
    Points
    34 084
    Billets dans le blog
    14
    Par défaut
    TRUNCATE supprime la table.
    Si tu veux vider la table, il faut utiliser DELETE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    -- Supprime toutes les lignes de la table
    DELETE FROM la_table

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 71
    Points : 57
    Points
    57
    Par défaut
    Je pensais que TRUNCATE pouvait faire l'affaire, en effet la documentation postgresql indique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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"

  4. #4
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 : 16 812
    Points : 34 084
    Points
    34 084
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par renardchan Voir le message
    Je pensais que TRUNCATE pouvait faire l'affaire, en effet la documentation postgresql indique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    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.

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/03/2012, 12h53
  2. trigger pour limiter une table
    Par galsen3 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 09/06/2009, 15h45
  3. Test d'existence d'une table avant insertion
    Par YavaDeus dans le forum PL/SQL
    Réponses: 2
    Dernier message: 22/04/2009, 13h10
  4. pb pour vider une table sous sql
    Par xence dans le forum Langage SQL
    Réponses: 3
    Dernier message: 24/03/2006, 09h09
  5. Trigger pour faire une table "mirroir"
    Par lgomez dans le forum Oracle
    Réponses: 8
    Dernier message: 26/10/2005, 14h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo