-
Notifications
You must be signed in to change notification settings - Fork 109
Description
Bonjour,
Dans le cadre d'une prestation pour l'Agence Régionale de la Biodiversité en île de France, il a été suggéré de pouvoir récupérer les informations liées à des tables avec clé étrangère.
Le module concerné dans la discussion est le module monitoring pour lequel la fonction fct_trg_log_changes
appelé par les trigger lors d'insertions, d'update, et de suppression ne retourne que les données liées aux tables t_base_site
et non les informations stockées dans t_site_complements
(même chose pour les visites et observations) .
L'idée que j'ai eu pour le moment serait de changer la fonction fct_trg_log_changes
en ajoutant deux paramètres (par défaut null pour garder le comportement actuel de la fonction) . Ces deux paramètres seraient le nom de la table et de la column qui vont servir à la jointure .
Ainsi si les deux paramètres ne sont pas NULL alors on réaliserait la jointure avant d'utiliser la fonction row_to_json
.
On peut être aussi passer par l'ajout de tables dans bib_tables_location
pour réaliser les jointures , (exemple ajout de colonne fk_field
à l'instar de la colonne pk_field
), à voir / discuter.
Je ne suis pas expert en sql, donc si des personnes avec une vision un peu plus aiguisée en sql ont des propositions plus pertinentes je suis tout ouïe .
Voici le code actuel de la fonction :
CREATE OR REPLACE FUNCTION gn_commons.fct_trg_log_changes()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
DECLARE
theschema text := quote_ident(TG_TABLE_SCHEMA);
thetable text := quote_ident(TG_TABLE_NAME);
theidtablelocation int;
theuuidfieldname character varying(50);
theuuid uuid;
theoperation character(1);
thecontent json;
BEGIN
--Retrouver l'id de la table source stockant l'enregistrement à tracer
SELECT INTO theidtablelocation gn_commons.get_table_location_id(theschema,thetable);
--Retouver le nom du champ stockant l'uuid de l'enregistrement à tracer
SELECT INTO theuuidfieldname gn_commons.get_uuid_field_name(theschema,thetable);
--Retrouver la première lettre du type d'opération (C, U, ou D)
SELECT INTO theoperation LEFT(TG_OP,1);
--Construction du JSON du contenu de l'enregistrement tracé
IF(TG_OP = 'INSERT' OR TG_OP = 'UPDATE') THEN
--Construction du JSON
select new.*,
thecontent := row_to_json(NEW.*);
--Récupérer l'uuid de l'enregistrement à tracer
EXECUTE format('SELECT $1.%I', theuuidfieldname) INTO theuuid USING NEW;
ELSIF (TG_OP = 'DELETE') THEN
--Construction du JSON
thecontent := row_to_json(OLD.*);
--Récupérer l'uuid de l'enregistrement à tracer
EXECUTE format('SELECT $1.%I', theuuidfieldname) INTO theuuid USING OLD;
END IF;
--Insertion du statut de validation et des informations associées dans t_validations
INSERT INTO gn_commons.t_history_actions (id_table_location,uuid_attached_row,operation_type,operation_date,table_content)
VALUES(
theidtablelocation,
theuuid,
theoperation,
NOW(),
thecontent
);
RETURN NEW;
END;
$function$