Commit 28f1343e authored by Jean-Philippe Metivier's avatar Jean-Philippe Metivier
Browse files

Merge branch 'main' of https://git.unicaen.fr/lib/unicaen/etat into HEAD

parents f911f107 eee09666
Loading
Loading
Loading
Loading
Loading

CHANGELOG.md

0 → 100644
+5 −0
Original line number Diff line number Diff line
CHANGELOG
=========
6.1.7 (08/01/2026)
------------------
- Procédure unicaen_etat_instance_clean
 No newline at end of file
+4 −1
Original line number Diff line number Diff line
@@ -148,8 +148,11 @@ La commande console `etatInstance:purge` permet de supprimer les instances d'ét
- `--categorie=XXX`,  *(ou `-t XXX`)* pour ne purger que les instances d'états historisées de la catégorie dont le code est `XXX`
- `--type=YYY`,  *(ou `-t YYY`)* pour ne purger que les instances d'états historisées du type dont le code est `XXX`

Purge des instances d'états non liée
---
La procédure SQL unicaen_etat_instance_clean() permet de supprimer les instances d'états qui ne sont plus liée a aucune entité.
!!! si les clés étrangères sont mal définie, il y a un risque de perte de données

Troubleshooting
===
- Pour nettoyer les instances d'état qui ne sont plus liées à rien, la procédure clear_etat_instance() est un exemple. 
- HistoCreateur/Modificateur/Destructeur prend l'utilisateur connecté lors du changement de statut ou par défaut le créateur de l'état précédent ce qui est potentiellement faux.
 No newline at end of file
+52 −0
Original line number Diff line number Diff line
/**
  * Procédure sql qui supprime les instances d'états qui ne sont plus reliées à aucune entités
  * !!! risque de perte de données si les clés étrangéres ne sont pas correctement définies
  * Conseil : faire en ammont un appel au bloc 'linkers' que l'on a bien toutes nos tables de linkers
  * Usage : call unicaen_etat_instance_clean();
 */
CREATE or replace PROCEDURE unicaen_etat_instance_clean()
	LANGUAGE plpgsql
AS
$$
declare
BEGIN
	DROP table IF EXISTS tmp_etat_instance_not_linked;

	EXECUTE (
		WITH linkers AS (
			SELECT tc.constraint_name
				 , tc.table_name
				 , kcu.column_name
				 , ccu.table_schema AS foreign_table_schema
				 , ccu.table_name   AS foreign_table_name
				 , ccu.column_name  AS foreign_column_name
			FROM information_schema.table_constraints AS tc
				     JOIN information_schema.key_column_usage AS kcu
				     ON tc.constraint_name = kcu.constraint_name
						     AND tc.table_schema = kcu.table_schema
				     JOIN information_schema.constraint_column_usage AS ccu
				     ON ccu.constraint_name = tc.constraint_name
			WHERE tc.constraint_type = 'FOREIGN KEY'
			  AND ccu.table_name = 'unicaen_etat_instance'
		)
		   , requetes AS (
			SELECT 'select ' || column_name || ' from ' || table_name AS sql
			FROM linkers
		)
		   , union_req AS (
			SELECT string_agg( sql, ' union ' ) AS sql
			FROM requetes
		)
		SELECT CONCAT( 'CREATE table tmp_etat_instance_not_linked AS ' ||
			               'select id from unicaen_etat_instance ' ||
			               'except (',
		               ( SELECT sql FROM union_req)
			       , ')'
		       )
	);
	DELETE FROM unicaen_etat_instance
	where id in (select * from tmp_etat_instance_not_linked);

	DROP table IF EXISTS tmp_etat_instance_not_linked;
end;
$$;
 No newline at end of file
+0 −28
Original line number Diff line number Diff line

-- Procédure permettant de supprimer automatiquement de unicaen_etat_instance des instance qui ne sont plus rattaché à rien
create or replace procedure clear_etat_instance()
    language plpgsql
as
$$
DECLARE
BEGIN

    with instances_lier as (
        select etat_instance_id from table_linker_1
        union select etat_instance_id from table_linker_2
        union select etat_instance_id from table_linker_3
              ...
    )
       , to_delete as (
        select i.id from unicaen_etat_instance i
                             left join instances_lier l on l.etat_instance_id = i.id
        where l.etat_instance_id is null
    )
    delete from unicaen_etat_instance where id in (select * from to_delete);
-- Remise au propre de la séquence
    perform SETVAL('unicaen_etat_instance_id_seq', COALESCE(MAX(id), 1) ) FROM unicaen_etat_instance;
    perform SETVAL('unicaen_validation_instance_id_seq', COALESCE(MAX(id), 1) ) FROM unicaen_validation_instance;
end;
$$;

call clear_etat_instance();
 No newline at end of file

readme.md

0 → 100644
+0 −0

Empty file added.