Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#1 Fri 13 July 2012 11:43

Squid
Participant actif
Date d'inscription: 2 Apr 2010
Messages: 109

Automatiser les minuscules des noms des tables/colonnes [PostgreSQL]

Bonjour,

Je souhaite automatiser la modification des noms de tables lors de leur import dans PostgreSQL.

Pour cela je pense utiliser la vue geometry_columns de PostGIS 2.0.

Voici le code tel qu'il est actuellement, non fonctionnel:

Code:

CREATE OR REPLACE FUNCTION rename_in_lowcase() RETURNS TRIGGER AS $body$
    DECLARE
    table_name character varying ;
    table_schema character varying ;
    new_table_name character varying ;
    
    BEGIN
        --Renomme une table en minuscule
        --http://www.postgresql.org/docs/current/static/plpgsql-trigger.html
    table_name := NEW.f_table_name;
    table_schema := NEW.f_table_schema;
    new_table_name := lower(table_name);
    EXECUTE 'ALTER TABLE '||quote_ident(table_schema)||'.'||quote_ident(table_name) ||' RENAME TO '|| new_table_name||'';
        RETURN NULL; -- result is ignored since this is an AFTER trigger
    END;
$body$ LANGUAGE plpgsql;


CREATE TRIGGER rename_table INSTEAD OF INSERT ON public.geometry_columns FOR EACH ROW EXECUTE PROCEDURE rename_in_lowcase();

Merci de m'aiguiller, je découvre les triggers.

Avez vous une méthode pour leur création et isoler les problèmes liés à la fonction qui contient des fonctions uniques aux triggers. Je ne sais pas comment la tester...

Merci

M.DIMECH

[EDIT] Je viens de lire ceci

Les actions TRIGGER, CLUSTER, OWNER, et TABLESPACE ne sont jamais propagées aux tables descendantes ; c'est-à-dire qu'elles agissent comme si ONLY est spécifié. Seules les ajouts de contraintes CHECK peuvent être propagés.

Tout changement sur une table du catalogue système est interdit.


http://docs.postgresql.fr/8.2/sql-altertable.html

Cela veut-il dire que ce n'est pas possible?

Merci

Dernière modification par Squid (Fri 13 July 2012 14:06)

Hors ligne

 

#2 Fri 13 July 2012 15:40

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1537

Re: Automatiser les minuscules des noms des tables/colonnes [PostgreSQL]

Bonjour,

1) Pour tester un trigger, le plus simple est encore de le créer et d'inserer des données dans la table a tester. Vous verrez alors si le trigger est déclenché et ce qu'il fait. Pour cela, la commande RAISE NOTICE (ou warning ou error) permet de logger les informations que vous voulez et de les voir lors de l'execution du trigger.

2) Il n'est pas possible de créer des triggers sur des vues, qui ne sont que des requetes enregistrées. Vous pouvez cependant créer des RULES, mecanisme propre a PG, qui permet de faire du SQL à la place d'une action d'insert, update, delete.

Par contre, je ne pense pas que ca marchera dans votre cas: postgis ne fait rien avec la vue geometry_columns: il n'y a pas d'insert ou d'update, donc a mon avis, pas de moyen de declencher votre règle.

Le mieux ici serait de controler le ou les clients qui créent des tables geographiques et forcer l'utilisation de minuscules.

Nicolas

Hors ligne

 

#3 Mon 16 July 2012 11:59

Squid
Participant actif
Date d'inscription: 2 Apr 2010
Messages: 109

Re: Automatiser les minuscules des noms des tables/colonnes [PostgreSQL]

Merci Nicolas,

Je vais demander sur le forum du créateur du client de rajouter une option conversion en minuscules.

En attendant j'ai créé ce script qui convertit toute la base en minuscules:

Code:

CREATE OR REPLACE FUNCTION rename_table_and_column_in_lowcase() RETURNS VOID AS $body$
    DECLARE
    schema_selected character varying;
    table_selected character varying;
    column_selected character varying;
    
    BEGIN
    FOR schema_selected in SELECT table_schema FROM information_schema.tables WHERE table_schema <> 'information_schema' AND table_schema <> 'pg_catalog' AND table_schema <> 'gdo' AND table_schema <> 'topology' and table_name<>'geometry_columns' and table_name<>'spatial_ref_sys' and table_name<>'geography_columns' and table_name<>'raster_columns' and table_name<>'raster_overviews' 
    LOOP
        FOR table_selected IN EXECUTE 'SELECT table_name FROM information_schema.tables WHERE table_schema='''||schema_selected||''' AND table_schema <> ''information_schema'' AND table_schema <> ''pg_catalog'' AND table_schema <> ''gdo'' AND table_schema <> ''topology'' and table_name<>''geometry_columns'' and table_name<>''spatial_ref_sys'' and table_name<>''geography_columns'' and table_name<>''raster_columns'' and table_name<>''raster_overviews'' '
        LOOP
            IF lower(table_selected)<>table_selected THEN
            EXECUTE 'ALTER TABLE ' || quote_ident( schema_selected ) || '.' || quote_ident(table_selected) || ' RENAME TO ' || lower(table_selected)|| '';
            END IF;
            FOR column_selected in EXECUTE 'SELECT column_name FROM information_schema.columns WHERE table_name ='''||lower(table_selected)||''''
            LOOP
                IF lower(column_selected)<>column_selected THEN
                    EXECUTE 'ALTER TABLE '||quote_ident( schema_selected )||'.'||lower(table_selected)||' RENAME "'||column_selected||'"  TO '||lower(column_selected)||' ';
                END IF;
            END LOOP;
        END LOOP;
    END LOOP;
    END;
$body$ LANGUAGE plpgsql;

SELECT rename_table_and_column_in_lowcase();

Réalisé d'après la page http://www.linuxscrew.com/2009/07/03/po … w-columns/

Bonne journée.

Dernière modification par Squid (Mon 16 July 2012 12:11)

Hors ligne

 

Pied de page des forums

Powered by FluxBB