Vous n'êtes pas identifié(e).
Pages : 1
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
Il n'existe rien pour cela. Votre besoin me semble cependant un peu étrange, quel problème cherchez vous à résoudre ?
Julien.
https://rjuju.github.io/
Hors ligne
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
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
Pages : 1