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

PostgreSQL Discussion :

Supprimer des tables dont le nom commence par XXX [FAQ]


Sujet :

PostgreSQL

  1. #1
    Membre régulier Avatar de Escandil
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2003
    Messages : 84
    Points : 70
    Points
    70
    Par défaut Supprimer des tables dont le nom commence par XXX
    Bonjour,

    Voila, je cherche a supprimer un ensemble de tables identifiées par un préfixe commun.
    En cherchant sur la FAQ, j'ai bien trouver un moyen simple de les lister
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     SELECTtablename FROM pg_tables WHERE tablename ~ 'XXX';
    Mais bien entendu, il est impossible de supprimer les tables a partir de la vue (j'ai essayer un DELETE FROM pg_tables WHERE tablename ~ 'XXX'; :p)

    Si vous avez des suggestions/méthodes, ça finira p-e dans la FAQ ^^

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    et avec une chtiote procédure stockée ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
    FOR tb IN SELECT tablename FROM pg_tables WHERE tablename ~ ''XXX''
      EXECUTE ''DROP TABLE '' || quote_ident(tb)
    END LOOP;
    ...
    Sauvegarder la base avant de tenter, bien entendu...
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Membre émérite
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Points : 2 545
    Points
    2 545
    Par défaut
    J'allais proposer la meme solution,
    merci GrandFather,
    je l'ajoute dans la FAQ et pensant à la transformer en procedure stockée.

    D'ailleur, je vois que l'on utilise dans l'exemple l'operateur ~ n'est ce pas un peu risqué ?
    remarque, un procedure stockée interressante serait tout simplement de mettre en parametre le pattern, non ?
    Delphi 2009 - ZeosLib - DevExpress - TMS - PgDAC
    PostgreSQL 8.4 sous Debian
    Sites : http://postgresql.developpez.com http://dgriessinger.developpez.com

  4. #4
    Membre régulier Avatar de Escandil
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2003
    Messages : 84
    Points : 70
    Points
    70
    Par défaut
    Je vais essayer cet apres midi. Mais effectivement le XXX sera passé en parametre afin de pouvoir appeler la procédure via un script. Ce dernier est issus d'un programme delphi qui gère la valeur du préfixe.

  5. #5
    Membre régulier Avatar de Escandil
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2003
    Messages : 84
    Points : 70
    Points
    70
    Par défaut
    Bien j'ai essayer de mettre en place une procedure suivants vos conseils, et voila a quoi j'arrive :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE OR REPLACE FUNCTION Supression_par_prefixe(VARCHAR) RETURNS VARCHAR AS '
    DECLARE
    prefixe ALIAS FOR $1;
    BEGIN
    FOR Table_Id IN SELECT Nom_avec_Prefixe FROM pg_tables WHERE Nom_avec_Prefixe ~prefixe
      EXECUTE ''DROP TABLE '' || quote_ident(Table_Id) 
    END LOOP;
    RETURNS ''Done'';
    END;
    ' LANGUAGE 'plpgsql';
    J'essaye de lancer la compilation avec PgAdmin, mais il me retourne l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ERROR:  missing ".." at end of SQL expression
    CONTEXT:  compile of PL/pgSQL function "supression_par_prefixe" near line 4
    Je debute en plpgsql, il y a donc sans doute de nombreuses autres fautes, et peut être de meilleures méthodes.

  6. #6
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Il ne faut pas oublier (ce que j'ai fait ) le LOOP à la fin de la ligne du for :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FOR Table_Id IN SELECT Nom_avec_Prefixe FROM pg_tables WHERE Nom_avec_Prefixe ~ prefixe LOOP
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  7. #7
    Membre émérite
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Points : 2 545
    Points
    2 545
    Par défaut
    C'est un record que ca renvoi, et en plus Nom_avec_Prefixe n'existe pas dans la table,
    je proposerai plus un truc du genre

    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
    16
    17
    18
     
    CREATE OR REPLACE FUNCTION "public"."droppertables" (text) RETURNS integer AS
    $body$
    /* On drop les tables selon le pattern passe en parametre
       en sortie on a le nombre de tables droppées 
     */
    DECLARE
     enregs record;
     compteur integer = 0 ;
    BEGIN
     FOR enregs IN SELECT tablename FROM pg_tables WHERE tablename ~ $1 LOOP
      --EXECUTE ''DROP TABLE '' || quote_ident(enregs.tablename)
      compteur:=compteur+1;
     END LOOP;
     return compteur;
    END;
    $body$
    LANGUAGE 'plpgsql' VOLATILE RETURNS NULL ON NULL INPUT SECURITY INVOKER;
    ATTENTION, ce code est dangeureux !!!! je dis ca pour les novices qui lirons le post, d'ailleur j'ai mis le drop en commentaire !

    De plus l'utilisation du mot prefixe n'est pas tout a fait exact, en expression reguliere le match ~ 'toto' va ressortir : toto01; toto02, mais aussi 01toto, 454toto4546, ... !!!!, il faut preciser dans le pattern ^toto, qui voudra dire commence par toto
    Delphi 2009 - ZeosLib - DevExpress - TMS - PgDAC
    PostgreSQL 8.4 sous Debian
    Sites : http://postgresql.developpez.com http://dgriessinger.developpez.com

  8. #8
    Membre régulier Avatar de Escandil
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2003
    Messages : 84
    Points : 70
    Points
    70
    Par défaut
    Merci beaucoup pour vos réponses, je vais essayer de mettre tout cela en place.

    Juste une question concernant la sécurité, (j'ai plus de base en Oracle et je pensais retrouvé le fonctionnement sous PostGres), une telle procedure pourrait elle permettre a un utilisateur de supprimer des tables sur lesquelles il n'a pas de droit ?
    Risque t il seulement de détruire ses propres tables ?

    Dans mon cas, la fonction sera créée au début du script est détruite en fin, mais la réponse m'intéresse.

    PS : Pour le ^ préfixe, je cherchait justement la syntaxe, mais le ^ provoque des erreurs de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ERROR:  operator does not exist: name ^ text
    HINT:  No operator matches the given name and argument type(s). You may need to add explicit type casts.
    CONTEXT:  SQL query "SELECT  tablename FROM pg_tables WHERE tablename ^  $1 "
    PL/pgSQL function "droppertables" line 9 at for over select rows

  9. #9
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Citation Envoyé par hpalpha
    De plus l'utilisation du mot prefixe n'est pas tout a fait exact, en expression reguliere le match ~ 'toto' va ressortir : toto01; toto02, mais aussi 01toto, 454toto4546, ... !!!!, il faut preciser dans le pattern ^toto, qui voudra dire commence par toto
    Tout à fait, ou alors utiliser LIKE (l'utilisation des expressions régulières ne s'impose pas ici).
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  10. #10
    Membre régulier Avatar de Escandil
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2003
    Messages : 84
    Points : 70
    Points
    70
    Par défaut
    Tir croisé pendant l'edit.

    Le LIKE permet de faire tourner la fonction, mais ne drop pas de table.
    D'ailleur le SELECT ne renvoie rien :-/

    Enfin je vais mettre le post en résolu, car leprincipal probleme est réglé, je noterai mes éventuelles découvertes à la suite (pour info) et j'apprécierai tout de même vos réponses

    En tout cas, un grand merci a tous les deux pour votre aide.

  11. #11
    Membre émérite
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Points : 2 545
    Points
    2 545
    Par défaut
    La requete est
    SELECT tablename FROM pg_tables WHERE tablename ~ $1

    ton argument est '^toto'

    donc en gros

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT droppertables('^toto');
    pour le like regarde ce post
    http://www.developpez.net/forums/viewtopic.php?t=388635

    il doit te manquer le %
    Delphi 2009 - ZeosLib - DevExpress - TMS - PgDAC
    PostgreSQL 8.4 sous Debian
    Sites : http://postgresql.developpez.com http://dgriessinger.developpez.com

  12. #12
    Membre régulier Avatar de Escandil
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2003
    Messages : 84
    Points : 70
    Points
    70
    Par défaut
    Bon j'apprends pas mal de trucs grace à vous ^^

    Donc pour le ^ ça marche effectivement, donc en laissant dans la procedure le $1 et le ^ dans mon script auto.

    J'ai réussi a faire marcher le like aussi du coup je n'avais pas mis de quote

    Merci pour votre aide une fois de plus

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Supprimer des jobs dont le nom de la DB se termine par xx
    Par janlouk dans le forum Développement
    Réponses: 2
    Dernier message: 19/02/2015, 13h38
  2. modifier des tables dont les noms sont dans une autre
    Par lapin_did dans le forum Requêtes
    Réponses: 1
    Dernier message: 06/09/2010, 09h45
  3. [Prototype] Chercher radio dont le nom commence par monradio
    Par kabkab dans le forum Bibliothèques & Frameworks
    Réponses: 2
    Dernier message: 29/12/2009, 13h44
  4. Recherche de fichiers dont le nom commence par..
    Par ValyGator dans le forum C++
    Réponses: 4
    Dernier message: 22/05/2006, 00h08
  5. Supprimer des tables dont le nom commence par XXX
    Par Escandil dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 11/04/2006, 21h46

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