MTES-MCT / metadata-postgresql

Plume : gestion des métadonnées du patrimoine PostgreSQL
https://mtes-mct.github.io/metadata-postgresql/
GNU Affero General Public License v3.0
1 stars 1 forks source link

Mise à jour impossible de l'extension PostgreSQL PlumePg (v0.0.1 vers v.0.1.0) #73

Closed alhyss closed 2 years ago

alhyss commented 2 years ago

Signalé par la DDT 16 le 14 juin 2022.

L'exécution de la commande ALTER EXTENSION plume_pg UPDATE ; donne lieu à l'erreur suivante sous PostgreSQL 10 :

ERREUR : ERREUR:  ALTER TYPE ... ADD ne peut pas être exécuté à partir d'une fonction ou d'une chaîne
contenant plusieurs commandes

État SQL : 25001
alhyss commented 2 years ago

Erreur reproduite sous PostgreSQL 10 et 11 lorsque la mise à jour est lancée par une commande directe. La mise à jour s'effectue normalement lorsque la commande est exécutée par une fonction plpgsql (cf. fonctions z_plume_recette.t003() et z_plume_recette.t018() et z_plume_recette.t019() de la recette), sauf à ce qu'Asgard soit actif sur la base. Dans ce cas, le message d'erreur est ALTER TYPE ... ADD ne peut pas être exécuté dans un bloc de transaction (testé uniquement sous PostgreSQL 10).

Sous PostgreSQL 12, 13 et 14, la mise à jour se déroule sans erreur, y compris avec Asgard.

Edit 1 : C'est effectivement une amélioration mentionnée dans la note de version de PostgreSQL 12.

Allow enumerated values to be added more flexibly (Andrew Dunstan, Tom Lane, Thomas Munro)

Previously, ALTER TYPE ... ADD VALUE could not be called in a transaction block, unless it was part of the same transaction that created the enumerated type. Now it can be called in a later transaction, so long as the new enumerated value is not referenced until after it is committed.

Edit 2 : Si les fonctions de la recette passent, c'est grâce au CREATE EXTENSION plume_pg VERSION '0.0.1' ; qui y précède toujours le ALTER EXTENSION plume_pg UPDATE ;. Concrètement la commande CREATE TYPE et la commande ALTER TYPE ... ADD VALUE font bien partie de la même transaction.

alhyss commented 2 years ago

Corrigé pour la version 0.1.1 de PlumePg, qui sera diffusée parallèlement à Plume 0.4.1.

La commande ALTER TYPE ... ADD VALUE du script de mise à jour est remplacée par une suppression/recréation du type, avec gestion des dépendances.

Avant :

-- Type: z_plume.meta_compute

ALTER TYPE z_plume.meta_compute ADD VALUE 'empty' AFTER 'auto' ;
ALTER TYPE z_plume.meta_compute ADD VALUE 'new' AFTER 'empty' ;

Après :

-- Type: z_plume.meta_compute

DROP VIEW z_plume.meta_template_categories_full ;
ALTER TABLE z_plume.meta_categorie
    ALTER COLUMN compute TYPE text[] ;
ALTER TABLE z_plume.meta_template_categories
    ALTER COLUMN compute TYPE text[] ;
DROP CAST (text[] AS z_plume.meta_compute[]) ;
DROP TYPE z_plume.meta_compute ;

CREATE TYPE z_plume.meta_compute AS ENUM (
    'auto', 'empty', 'new', 'manual'
    ) ;

COMMENT ON TYPE z_plume.meta_compute IS 'Types de fonctionnalités de calcul des métadonnées supportées par Plume.' ;

CREATE CAST (text[] AS z_plume.meta_compute[])
    WITH INOUT
    AS IMPLICIT ;

ALTER TABLE z_plume.meta_categorie
    ALTER COLUMN compute TYPE z_plume.meta_compute[] ;
ALTER TABLE z_plume.meta_template_categories
    ALTER COLUMN compute TYPE z_plume.meta_compute[] ;
-- la vue est recréée plus loin