Pages: 1
- Sujet précédent - Automatiser les minuscules des noms des tables/colonnes [PostgreSQL] - Sujet suivant
#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: 1554
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
Pages: 1
- Sujet précédent - Automatiser les minuscules des noms des tables/colonnes [PostgreSQL] - Sujet suivant