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

Pour sa 21ème année, l’association GeoRezo a toujours besoin de vous !

10€ = 1 mois de frais bancaires ; 15€ = 12 mois de nom de domaine ; 30€ = 1 semaine de location des serveurs …

Faire un don 

Retrouver nos membres bienfaiteurs

#1 Mon 27 February 2023 11:45

image95
Participant assidu
Date d'inscription: 6 Sep 2014
Messages: 259

Répéter opérations sur 50 tables d'un même schema?

Bonjour,
Je suis débutant avec Postgresql. J'ai 50 tables dans un schéma "ign" (schéma autre que public).
Je souhaite pour chacune de ces 50 tables :

- Ajouter un prefixe au nom de la table : "IGN_bdTopo_"
- Ajouter un suffixe au nom de la table : "_V1"
- créer une nouvelle colonne "date" de type date. Et peupler ce champ avec la valeur : 15/06/2021
- créer une nouvelle colonne "source" de type varchar (longueur 50). Et peupler ce champ avec la valeur : 'ign'.
- déplacer tous les éléments de ces 50 tables (including all). du schema "ign" vers le schema "ign_v2". Que ce soit les donnée, les contraintes, les indexes.

Si une personne pense pouvoir m'aider ? Merci beaucoup.

Hors ligne

 

#2 Mon 27 February 2023 14:33

tweaxy
Participant actif
Lieu: Abbeville
Date d'inscription: 27 Dec 2018
Messages: 76

Re: Répéter opérations sur 50 tables d'un même schema?

Bonjour,

Une extension e-maj qui répondrait à cela existe à priori : https://github.com/dalibo/emaj et https://emaj.readthedocs.io/fr/latest/ (Merci jmarsac)

N'ayant pas testé cette extension, vous pouvez également passer par une deux functions (peut être existe-t-il une méthode plus simple).

Code:

create or replace function create_trigger() returns integer as $$
declare
    v_count integer;
    v_table record;
begin
    v_count := 0;

    FOR v_table IN
        SELECT  n.nspname AS schemaname,
        c.relname AS tablename
        FROM pg_catalog.pg_class c
        LEFT JOIN pg_catalog.pg_namespace n ON (n.oid = c.relnamespace)
        WHERE c.relkind IN ('r') AND n.nspname = 'ign'
    LOOP
        EXECUTE 'ALTER TABLE ' || quote_ident(v_table.schemaname) || '.' || quote_ident(v_table.tablename) || ' ADD COLUMN date date';
        EXECUTE 'UPDATE ' || quote_ident(v_table.schemaname) ||'.'|| quote_ident(v_table.tablename) || ' SET date = ''15/06/2021'' ';
        
        EXECUTE 'ALTER TABLE ' || quote_ident(v_table.schemaname) || '.' || quote_ident(v_table.tablename) || ' ADD COLUMN source varchar(50)';
        EXECUTE 'UPDATE ' || quote_ident(v_table.schemaname) || '.' || quote_ident(v_table.tablename) || ' SET source =  ''ign'' ';
        
        EXECUTE 'ALTER TABLE ' || quote_ident(v_table.schemaname) || '.' || quote_ident(v_table.tablename) || ' RENAME TO ign_bdtopo_' || quote_ident(v_table.tablename)||'_v1';

        v_count := v_count + 1;
    END LOOP;
   
    RETURN v_count;
end
$$ language 'plpgsql';


create or replace function move_table() returns integer as $$
declare
    v_count integer;
    v_table record;
begin
    v_count := 0;

    FOR v_table IN
        SELECT  n.nspname AS schemaname,
        c.relname AS tablename
        FROM pg_catalog.pg_class c
        LEFT JOIN pg_catalog.pg_namespace n ON (n.oid = c.relnamespace)
        WHERE c.relkind IN ('r') AND n.nspname = 'ign'
    LOOP
        EXECUTE 'ALTER TABLE ' || quote_ident(v_table.schemaname) || '.' || quote_ident(v_table.tablename) || ' SET SCHEMA ign_v2' ;
    END LOOP;
   
    RETURN v_count;
end
$$ language 'plpgsql';


select create_trigger();
select move_table();

Les noms de table sont ici en minuscule.
Si vous voulez impérativement nommer vos tables avec des majuscules (plutôt déconseillé, cela évite de mettre des "" dans les requêtes SQL), il vous faudra adapter un petit peu ce code avec des "".

Ce code fonctionne de mon côté (pg version 9.6)

Cordialement,
Léandre BERON

Hors ligne

 

#3 Tue 28 February 2023 13:51

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

Re: Répéter opérations sur 50 tables d'un même schema?

Bonjour,

Sinon sans utiliser de fonctions, ce qui se fait souvent pour de l'admin comme celle-la est d'écrire une requête SQL qui fabrique du SQL, qui sera ensuite lancé.

psql permet de lancer le résultas de requêtes SQL comme nouvelles requetes (\gexec).


Par exemple, pour renommer des tables: (ce 'format' peut etre complété pour ajouter toutes les modifs que vous voulez sur les tables)

Code:

select format('alter table ign.%1$I rename to ign_bdtopo_%1$I_v1;', table_name) as query
from information_schema.tables 
where table_schema = 'ign';

Nicolas

Hors ligne

 

Pied de page des forums

Powered by FluxBB