PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 08/03/2017 17:56:17

update massif

Bonjour,

Je dois écrire une fonction qui fasse un update dans les tables du schema s à partir du schema t.

Je dois donc écrire pour chaque table

UPDATE 
    s.table_a AS s 
SET 
    col1 = t.col1
FROM 
    t.table_a AS t
WHERE 
    t.id = s.id;

Mais étant paresseux, j'aimerais ne pas devoir écrire autant de clauses SET qu'il y de colonnes dans les 80 tables de l'application.

Y a-t-il un procédé pg pour updater tous les champs qui ne sont pas pk et fk ?

Sinon, je générerais la function par un script meta-sql.

Merci pour votre attention.

Hors ligne

#2 08/03/2017 19:44:22

rjuju
Administrateur

Re : update massif

Il n'existe rien pour cela.  Votre besoin me semble cependant un peu étrange, quel problème cherchez vous à résoudre ?

Hors ligne

#3 08/03/2017 19:50:28

Re : update massif

Merci pour votre réponse.

Nous avons une db centrale.

On la copie sur des tablettes pour les agents qui parcourent le monde.

Quand ils reviennent, on met à jour la db centrale à partir de leur db modifiée en suivant des business rules spécifiques à la firme.

Voilà...

Je suis, bien sûr, ouvert à toute suggestion.

Bonne soirée à vous et à tous les dalibiens.

Hors ligne

#4 10/03/2017 12:46:17

Re : update massif

Finalement, j'ai écrit une fonction update par table.
Pour ce faire, j'ai écrit ce script de 83 lignes qui génère les 1488 lignes de code.

!/bin/bash 

tables_pk="tables_pk.txt" 
while IFS="," read -r table_name pk_name  
do 
       echo 
       echo "create or replace function sync.update_$table_name(schema_name varchar, audit_id bigint) returns void as \$\$" 
       echo 
       echo "declare stmt varchar; info varchar; pk_name varchar; this_pk integer;" 
       echo 
       echo "begin" 
       echo 
       echo 
       echo "execute format('select \"%s\" from public.\"$table_name\" where audit_id = \$1','$pk_name') 
               into this_pk 
               using audit_id;" 
       echo 
       echo "if this_pk is null then 

               info := format('In update : no record found in $table_name where audit_id = %s', audit_id); 

               insert into sync.log values (schema_name, info); 
                
               return;" 

       echo "end if;" 
       echo 
       echo "stmt := 'update public.\"$table_name\" as p set" 

       set_clause=`psql -qtA contacts -c  "  
               select 
                          '\"'  
                       || c.column_name  
                       || '\"' 
                       || '\"'  
                       || ' = '  
                       || 's.'  
                       || '\"'  
                       || c.column_name  
                       || '\"'  
                       || ',' 
               from  
                       information_schema.tables as t  
               join 
                       information_schema.columns as c on t.table_name = c.table_name  
               where 
                       t.table_schema = 'public'  
               and  
                       c.table_schema = 'public'  
               and  
                       c.column_name not in (  
                               select 
                                       kcu.column_name 
                               from  
                                       information_schema.table_constraints as tc  
                               join  
                                       information_schema.key_column_usage as kcu  
                                               on tc.constraint_name = kcu.constraint_name 
                               join  
                                       information_schema.constraint_column_usage as ccu  
                                               on ccu.constraint_name = tc.constraint_name 
                               where  
                                       (constraint_type = 'FOREIGN KEY' or constraint_type = 'PRIMARY KEY') 
                               and  
                                       tc.table_name = '$table_name' 
                       ) 
               and 
                       c.column_name != 'audit_id'
               and 
                       t.table_name = '$table_name'"` 

       echo "${set_clause::-1}"         
       echo "';" 
       echo 
       echo "stmt := stmt || ' from %s.\"$table_name\" as s where p.\"$pk_name\" = \$1';"  
       echo 
       echo "execute format(stmt, schema_name, pk_name) using this_pk;" 
       echo 
       echo "exception when others then insert into sync.log values(schema_name ,sqlerrm);" 
       echo 
       echo "end \$\$ language 'plpgsql';" 
       echo 

done < "$tables_pk"

Bon week-end

Hors ligne

Pied de page des forums