Projet

Général

Profil

Development #50462

crash sur fonction immutable_unaccent absente

Ajouté par Frédéric Péters il y a plus de 3 ans. Mis à jour il y a environ 3 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
-
Version cible:
-
Début:
22 janvier 2021
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

ProgrammingError at /manage/users/
ERREUR:  la fonction immutable_unaccent(text) n'existe pas
LINE 1: ...OM (SELECT "custom_user_user"."id" AS Col1, LOWER(immutable_...
                                                             ^
HINT:  Aucune fonction ne correspond au nom donné et aux types d'arguments.

Dans src/authentic2/migrations/0028_trigram_unaccent_index.py si je comprends bien ça assure que ça passe la migration sans planter mais ensuite ça crashe alors sur l'utilisation de /manage/users/ (de manière discrète, erreur 500 dans l'appel ajax).


Fichiers

Révisions associées

Révision 8e191dcc (diff)
Ajouté par Benjamin Dauvergne il y a environ 3 ans

misc: add migration to fix absence of immutable_unaccent() (#50462)

Historique

#1

Mis à jour par Frédéric Péters il y a plus de 3 ans

Vraisemblablement ça arrive là où au moment de la migration l'extension unaccent n'avait pas été installée. (?)

Ça pourrait se réparer de manière automatique en recréant une migration créant la fonction ?

#3

Mis à jour par Paul Marillonnet il y a plus de 3 ans

Est-ce possible que ce soit la classe de lookup pg authentic2.utils.lookups.Unaccent :

class Unaccent(PGUnaccent):
    function = 'immutable_unaccent'

utilisée dans la recherche des usagers en texte libre (détection des doublons), qui à tort ne tient pas compte que depuis d0f26f3c cette fonction @immutable_unaccent" se trouve dans le schéma public ?

#4

Mis à jour par Frédéric Péters il y a plus de 3 ans

Non, la fonction n'était tout simplement pas définie là où j'ai regardé,

authentic2_multitenant=> \df connexion_###.immutable_unaccent
                                Liste des fonctions
 Schéma | Nom | Type de données du résultat | Type de données des paramètres | Type 
--------+-----+-----------------------------+--------------------------------+------
(0 ligne)

authentic2_multitenant=> \df public.immutable_unaccent
                                Liste des fonctions
 Schéma | Nom | Type de données du résultat | Type de données des paramètres | Type 
--------+-----+-----------------------------+--------------------------------+------
(0 ligne)
#6

Mis à jour par Paul Marillonnet il y a plus de 3 ans

Frédéric Péters a écrit :

Non, la fonction n'était tout simplement pas définie là où j'ai regardé,

[...]

Edit: je suspectais une typo mais non Fred a visé juste, la fonction n’est pas définie ni dans le schéma public ni ailleurs :/

#7

Mis à jour par Frédéric Péters il y a plus de 3 ans

Heureusement j'avais vérifié correctement avant, j'ai amendé mon commentaire.

#9

Mis à jour par Benjamin Dauvergne il y a environ 3 ans

  • Assigné à mis à Benjamin Dauvergne

Je prends.

#10

Mis à jour par Benjamin Dauvergne il y a environ 3 ans

  • cd31 :
    bdauvergne@dmzt-gru-publik:~$ sudo -u postgres psql
    psql (11.9 (Debian 11.9-0+deb10u1))
    Saisissez « help » pour l'aide.
    
    postgres=# \c authentic2_multitenant 
    Vous êtes maintenant connecté à la base de données « authentic2_multitenant » en tant qu'utilisateur « postgres ».
    authentic2_multitenant=# \dn
                            Liste des schémas
                       Nom                    |     Propriétaire      
    ------------------------------------------+-----------------------
     connexion_services_test_haute_garonne_fr | authentic-multitenant
     public                                   | postgres
    (2 lignes)
    
    authentic2_multitenant=# set search_path = connexion_services_test_haute_garonne_fr;
    SET
    authentic2_multitenant=# \df publib.immutable_unaccent
                                    Liste des fonctions
     Schéma | Nom | Type de données du résultat | Type de données des paramètres | Type 
    --------+-----+-----------------------------+--------------------------------+------
    (0 ligne)
    
    authentic2_multitenant=# CREATE OR REPLACE FUNCTION public.immutable_unaccent(text) RETURNS varchar AS $$ SELECT public.unaccent('public.unaccent',$1::text); $$ LANGUAGE 'sql' IMMUTABLE;
    CREATE FUNCTION
    authentic2_multitenant=# CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
    CREATE INDEX
    authentic2_multitenant=# 
    

PS: j'ai corrigé les propriétaires après coup.

#11

Mis à jour par Benjamin Dauvergne il y a environ 3 ans

  • grandlyon-cut-test :
    pddv-gdlyon-cut-front-sso-2:/home/entrouvert# PGPASSWORD=<sniped> psql -U entrouvert -h postgres.gl -p 9999 authentic_test
    psql (11.9 (Debian 11.9-0+deb10u1), serveur 9.6.3)
    Connexion SSL (protocole : TLSv1.2, chiffrement : ECDHE-RSA-AES256-GCM-SHA384, bits : 256, compression : désactivé)
    Saisissez « help » pour l'aide.
    
    authentic_test=# \dn
                 Liste des schémas
                 Nom             | Propriétaire 
    -----------------------------+--------------
     moncompte_rec_grandlyon_com | entrouvert
     public                      | postgres
    (2 lignes)
    
    authentic_test=# set search_path = moncompte_rec_grandlyon_com;
    SET
    authentic_test=# 
    authentic_test=# CREATE OR REPLACE FUNCTION public.immutable_unaccent(text) RETURNS varchar AS $$ SELECT public.unaccent('public.unaccent',$1::text); $$ LANGUAGE 'sql' IMMUTABLE;
    CREATE FUNCTION
    authentic_test=# \df immutable_unaccent 
                                                      Liste des fonctions
               Schéma            |        Nom         | Type de données du résultat | Type de données des paramètres | Type 
    -----------------------------+--------------------+-----------------------------+--------------------------------+------
     moncompte_rec_grandlyon_com | immutable_unaccent | character varying           | text                           | func
    (1 ligne)
    
    authentic_test=# \df public.immutable_unaccent 
                                            Liste des fonctions
     Schéma |        Nom         | Type de données du résultat | Type de données des paramètres | Type 
    --------+--------------------+-----------------------------+--------------------------------+------
     public | immutable_unaccent | character varying           | text                           | func
    (1 ligne)
    
    authentic_test=# drop function immutable_unaccent ;
    ERREUR:  erreur de syntaxe sur ou près de « ; »
    LIGNE 1 : drop function immutable_unaccent ;
                                               ^
    authentic_test=# drop function immutable_unaccent ;
    ERREUR:  erreur de syntaxe sur ou près de « ; »
    LIGNE 1 : drop function immutable_unaccent ;
                                               ^
    authentic_test=# \help drop function
    Commande :    DROP FUNCTION
    Description : supprimer une fonction
    Syntaxe :
    DROP FUNCTION [ IF EXISTS ] nom [ ( [ [ mode_argument ] [ nom_agrégat ] type_argument [, ...] ] ) ] [, ...]
        [ CASCADE | RESTRICT ]
    
    authentic_test=# drop function moncompte_rec_grandlyon_com.immutable_unaccent(text) ;
    ERREUR:  n'a pas pu supprimer fonction immutable_unaccent(text) car d'autres objets en dépendent
    DÉTAIL : index custom_user_name_gist_idx dépend de fonction immutable_unaccent(text)
    ASTUCE : Utilisez DROP ... CASCADE pour supprimer aussi les objets dépendants.
    authentic_test=# drop function moncompte_rec_grandlyon_com.immutable_unaccent(text) cascade;
    NOTICE:  DROP cascade sur index custom_user_name_gist_idx
    DROP FUNCTION
    authentic_test=# CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
    CREATE INDEX
    authentic_test=# 

Ici la fonction existait mais pas dans le bon schéma, j'ai déplacé.

#12

Mis à jour par Benjamin Dauvergne il y a environ 3 ans

  • grandlyon-formpub-test :
    authentic2_multitenant=# set search_path = connexion_recette_formulaireextranet_grandlyon_com;
    SET
    authentic2_multitenant=# CREATE OR REPLACE FUNCTION public.immutable_unaccent(text) RETURNS varchar AS $$ SELECT public.unaccent('public.unaccent',$1::text); $$ LANGUAGE 'sql' IMMUTABLE;
    CREATE FUNCTION
    authentic2_multitenant=# alter function public.immutable_unaccent(text) owner to "authentic-multitenant";
    ALTER FUNCTION
    authentic2_multitenant=# CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
    CREATE INDEX
    authentic2_multitenant=# alter index custom_user_name_gist_idx owner to "authentic-multitenant";
    ALTER INDEX
    authentic2_multitenant=# set search_path = connexion_recette_formulaireintranet_grandlyon_com;
    SET
    authentic2_multitenant=# CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
    CREATE INDEX
    authentic2_multitenant=# alter index custom_user_name_gist_idx owner to "authentic-multitenant";
    ALTER INDEX
    
    
#13

Mis à jour par Benjamin Dauvergne il y a environ 3 ans

  • grandlyon-guichet-test-1 : déjà ok
  • grenoble-test :
    authentic2_multitenant=# CREATE OR REPLACE FUNCTION public.immutable_unaccent(text) RETURNS varchar AS $$ SELECT public.unaccent('public.unaccent',$1::text); $$ LANGUAGE 'sql' IMMUTABLE;
    CREATE FUNCTION
    authentic2_multitenant=# alter function public.immutable_unaccent(text) owner to "authentic-multitenant";
    ALTER FUNCTION
    authentic2_multitenant=# set search_path = connexion_test_demarches_grenoblealpesmetropole_fr;
    SET
    authentic2_multitenant=# CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
    CREATE INDEX
    authentic2_multitenant=# alter index custom_user_name_gist_idx owner to "authentic-multitenant";
    ALTER INDEX
    authentic2_multitenant=# set search_path = connexion_test_demarches_lametro_fr;
    SET
    authentic2_multitenant=# CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
    CREATE INDEX
    authentic2_multitenant=# alter index custom_user_name_gist_idx owner to "authentic-multitenant";
    ALTER INDEX
    
  • lille-test : ok
  • moselle-test : pas d'authentic
  • moselle-test-authenic: impossible de créer l'extension unaccent, abandon
#14

Mis à jour par Frédéric Péters il y a environ 3 ans

Mon idée c'est que tu ne vas pas aller exécuter ça partout (juste pas possible, accès etc.) et donc ma question : Ça pourrait se réparer de manière automatique en recréant une migration créant la fonction ?

#15

Mis à jour par Benjamin Dauvergne il y a environ 3 ans

  • nanterre-preprod-web1 :
    psql -U authentic -h sql-preprod authentic
    authentic=> CREATE OR REPLACE FUNCTION public.immutable_unaccent(text) RETURNS varchar AS $$ SELECT public.unaccent('public.unaccent',$1::text); $$ LANGUAGE 'sql' IMMUTABLE;
    CREATE FUNCTION
    authentic=> alter function public.immutable_unaccent(text) owner to "authentic";
    ALTER FUNCTION
    authentic=> CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
    CREATE INDEX
    authentic=> alter index custom_user_name_gist_idx owner to "authentic";
    ALTER INDEX
    authentic=> 
    
  • sictiam-test :
set search_path=connexion_anselmo_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_capdail_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_cdg46_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_cdg47_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_commune_de_poucheres_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_commune_de_st_priest_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_darell_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_demo01_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_demo_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_dep06_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_departement06_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_dimebag_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_formation_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_formation_test_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_la_seyne_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_mairie_de_bandol_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_mairie_de_bandol_test_demarches_sictiam_fr_invalid;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_mairie_de_cannes_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_mairie_de_julien_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_massoins_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_mustaine_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_paysdegrasse_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_saintvallierdethiey_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_sictiam_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_smopaca_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_sospel_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_sve_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_test_innovative_city_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_test_ozwilllo_110717_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_test_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_test_veille_inauguration_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_testbor20170629_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_testbor20170630_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_testbor20170705_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_testbor20170710_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_testbor20170714_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_tsl_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_une_raison_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_vallee_des_baux_alpilles_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_vienneservices_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_vosdemarches2_cannes_com;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
set search_path=connexion_zago_test20181005_test_demarches_sictiam_fr;
CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
* sitiv-test :
authentic2_multitenant=> CREATE OR REPLACE FUNCTION public.immutable_unaccent(text) RETURNS varchar AS $$ SELECT public.unaccent('public.unaccent',$1::text); $$ LANGUAGE 'sql' IMMUTABLE;
CREATE FUNCTION
authentic2_multitenant=> set search_path = connexion_corbas_test_demarches_sitiv_fr;
SET
authentic2_multitenant=> CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
CREATE INDEX
authentic2_multitenant=> set search_path = connexion_modele_test_demarches_sitiv_fr ;
SET
authentic2_multitenant=> CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
CREATE INDEX
authentic2_multitenant=> set search_path = connexion_saint_chamond_test_demarches_sitiv_fr ;
SET
authentic2_multitenant=> CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
CREATE INDEX
authentic2_multitenant=> set search_path = connexion_venissieux_test_demarches_sitiv_fr ;
SET
authentic2_multitenant=> CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
CREATE INDEX
authentic2_multitenant=> 
* toulouse-bac-a-sable (je viens de penser à utiliser authentic2-multitenant-manage dbshell plutôt que de chercher les bons identifiants à chaque fois) :
authentic=> set search_path = connexion_moncompte_cutm_ea_dev_publik_nfrance_com ;
authentic=> CREATE OR REPLACE FUNCTION public.immutable_unaccent(text) RETURNS varchar AS $$ SELECT public.unaccent('public.unaccent',$1::text); $$ LANGUAGE 'sql' IMMUTABLE;
CREATE FUNCTION
authentic=> CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
CREATE INDEX
authentic=> 
  • toulouse-test-1 :
    authentic2_multitenant=> set search_path = connexion_cutm_publik_preprod_nfrance_com ;
    SET
    authentic2_multitenant=> CREATE OR REPLACE FUNCTION public.immutable_unaccent(text) RETURNS varchar AS $$ SELECT public.unaccent('public.unaccent',$1::text); $$ LANGUAGE 'sql' IMMUTABLE;
    CREATE FUNCTION
    authentic2_multitenant=> CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
    CREATE INDEX
    
  • villejuif-test :
    authentic2_multitenant=> set search_path  = connexion_dev_villejuif_fr ;
    SET
    authentic2_multitenant=> CREATE OR REPLACE FUNCTION public.immutable_unaccent(text) RETURNS varchar AS $$ SELECT public.unaccent('public.unaccent',$1::text); $$ LANGUAGE 'sql' IMMUTABLE;
    CREATE FUNCTION
    authentic2_multitenant=> CREATE INDEX custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);
    CREATE INDEX
    

Bon la prod maintenant.

#16

Mis à jour par Benjamin Dauvergne il y a environ 3 ans

Frédéric Péters a écrit :

Mon idée c'est que tu ne vas pas aller exécuter ça partout (juste pas possible, accès etc.) et donc ma question : Ça pourrait se réparer de manière automatique en recréant une migration créant la fonction ?

Non ça ira plus vite à la main, j'ai déjà fini les recette; par contre là ou c'est juste impossible (je ne vois que la moselle), il faut ouvrir un ticket spécifique pour leur demander de créer l'extension (peut-être existe-t-il déjà).

#18

Mis à jour par Benjamin Dauvergne il y a environ 3 ans

ok.

#23

Mis à jour par Benjamin Dauvergne il y a environ 3 ans

J'ai viré les DROP puisque de toute façon ce n'est qu'une redit d'une migration précédente et j'ai ajouté la création aussi de l'index trigramme avec IF NOT EXISTS puisque forcément si immutable_unaccent était absent alors l'index aussi.

#24

Mis à jour par Benjamin Dauvergne il y a environ 3 ans

En prod:
  • cd31 ok
  • grenoble ok
  • lille ok
  • grandlyon le problème n'existe pas pour le CUT et le guichet
  • toulouse non plus
  • villejuif non plus
  • sitiv non plus
  • nanterre prod, la fonction est absente et l'extension n'est pas installée, il faudra que je gère avec eux demain, en attendant j'ai posé une fonction du même nom qui ne fait rien
#25

Mis à jour par Benjamin Dauvergne il y a environ 3 ans

sictiam-prod le problème n'est pas présent non plus.

#26

Mis à jour par Frédéric Péters il y a environ 3 ans

  • Statut changé de Solution proposée à Solution validée

(je me disais aussi que ce genre de trucs pourrait peut-être avoir sa place dans check-and-repair)

#27

Mis à jour par Benjamin Dauvergne il y a environ 3 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit 8e191dcc225464222285bd44b6559c6946e1a7aa
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Mon Jan 25 14:23:09 2021 +0100

    misc: add migration to fix absence of immutable_unaccent() (#50462)
#28

Mis à jour par Frédéric Péters il y a environ 3 ans

Je ne sais pas si c'est volontaire mais ça introduit une mise à jour ratée si jamais il y avait eu précédente réparation manuellement et que la fonction avait été créée avec le mauvais utilisateur,

jan 29 00:11:37 …-vm3 authentic2-multitenant-manage[17670]:   File "/usr/lib/python3/dist-packages/django/db/backends/base/schema.py", line 136, in execute
jan 29 00:11:37 …-vm3 authentic2-multitenant-manage[17670]:     cursor.execute(sql, params)
jan 29 00:11:37 …-vm3 authentic2-multitenant-manage[17670]:   File "/usr/lib/python3/dist-packages/django/db/backends/utils.py", line 64, in execute
jan 29 00:11:37 …-vm3 authentic2-multitenant-manage[17670]:     return self.cursor.execute(sql, params)
jan 29 00:11:37 …-vm3 authentic2-multitenant-manage[17670]:   File "/usr/lib/python3/dist-packages/django/db/utils.py", line 94, in __exit__
jan 29 00:11:37 …-vm3 authentic2-multitenant-manage[17670]:     six.reraise(dj_exc_type, dj_exc_value, traceback)
jan 29 00:11:37 …-vm3 authentic2-multitenant-manage[17670]:   File "/usr/lib/python3/dist-packages/django/utils/six.py", line 685, in reraise
jan 29 00:11:37 …-vm3 authentic2-multitenant-manage[17670]:     raise value.with_traceback(tb)
jan 29 00:11:37 …-vm3 authentic2-multitenant-manage[17670]:   File "/usr/lib/python3/dist-packages/django/db/backends/utils.py", line 62, in execute
jan 29 00:11:37 …-vm3 authentic2-multitenant-manage[17670]:     return self.cursor.execute(sql)
jan 29 00:11:37 …-vm3 authentic2-multitenant-manage[17670]: django.db.utils.ProgrammingError: ERREUR:  doit être le propriétaire de la fonction immutable_unaccent
jan 29 00:11:38 …-vm3 systemd[1]: authentic2-multitenant.service: Control process exited, code=exited, status=1/FAILURE
jan 29 00:11:38 …-vm3 systemd[1]: authentic2-multitenant.service: Failed with result 'exit-code'.
#29

Mis à jour par Frédéric Péters il y a environ 3 ans

  • Statut changé de Résolu (à déployer) à Solution déployée
#30

Mis à jour par Benjamin Dauvergne il y a environ 3 ans

C'est quel serveur ?

#33

Mis à jour par Benjamin Dauvergne il y a environ 3 ans

Frédéric Péters a écrit :

(je me disais aussi que ce genre de trucs pourrait peut-être avoir sa place dans check-and-repair)

#50680

#35

Mis à jour par Benjamin Renard il y a environ 3 ans

Je viens de rencontrer ce bug sur une instance d'Authentic récemment mise à jour de la version 2.92-1~eob90+1 vers la version 2.95-1~eob90+1. J'ai vu que le correctif a été fourni avec la version 2.89 et je ne suis pas sûr que ce bug n'était pas déjà présent avant et notamment depuis ma dernière mise à jour d'il y a 2 semaines (2.85-1~eob90+1 => 2.92-1~eob90+1).

Après vérification, le migration corrective "0033_recreate_immutable_unaccent" était pourtant bien considérée comme appliquée par authentic2-manage showmigrations. Pour les extensions unaccent et pg_trgm n'était pas présentent, tout comme la fonction immutable_unaccent et l'index custom_user_name_gist_idx .

J'ai corrigé le problème en appliquant manuellement les modifications de cette migration :

su - postgres
psql authentic2
CREATE EXTENSION unaccent WITH SCHEMA public;
CREATE EXTENSION pg_trgm WITH SCHEMA public;
CREATE OR REPLACE FUNCTION public.immutable_unaccent(text) RETURNS varchar AS $$ SELECT public.unaccent('public.unaccent',$1::text); $$ LANGUAGE 'sql' IMMUTABLE;
CREATE INDEX IF NOT EXISTS custom_user_name_gist_idx ON custom_user_user USING gist (LOWER(public.immutable_unaccent(first_name || ' ' || last_name)) public.gist_trgm_ops);

Peut-être ce correctif ne prend-il pas bien en compte les installations non-multitenant ?

#36

Mis à jour par Frédéric Péters il y a environ 3 ans

Je dirais plutôt qu'elle a été exécutée alors que les extensions n'étaient pas disponibles et pas activables par authentic. Le plan est de modifier les migrations pour ne plus passer silencieusement sur cette absence, c'est dans #47699.

#37

Mis à jour par Benjamin Renard il y a environ 3 ans

Frédéric Péters a écrit :

Je dirais plutôt qu'elle a été exécutée alors que les extensions n'étaient pas disponibles et pas activables par authentic. Le plan est de modifier les migrations pour ne plus passer silencieusement sur cette absence, c'est dans #47699.

OK, merci pour l'info.

Ce n'est pas directement lié, mais ça concerne un peu le même sujet : depuis quelques versions, l'installation de zéro d'une nouvelle instance Authentic est un peu compliqué au niveau de la base de données du fait que le postinst du paquet ne s'occupe plus via dbconfig de créer la base Postgres. Il est donc nécessaire de la créer manuellement, mettre en place manuellement le fichier /etc/authentic2/db.conf et vue que l'ajout d'extensions nécessite des droits super-utilisateurs au niveau Postgres, il faut également s'occuper d'ajouter manuellement ces extensions dans la base nouvelle créée. Pour finir, il faudra certainement lancer un migrate manuellement. Bref, diverses étapes à gérer manuellement alors que c'était automatique auparavant et qu'il n'existe aucune doc à priori les listant (en particulier les extensions à ajouter à la base).

PS : J'espère me tromper et ne pas être au courant d'une dernière évolution récente, mais j'ai encore constaté le problème vendredi dernier lors d'une installation sur une Debian Buster toute neuve.

#38

Mis à jour par Benjamin Renard il y a environ 3 ans

Frédéric Péters a écrit :

Je dirais plutôt qu'elle a été exécutée alors que les extensions n'étaient pas disponibles et pas activables par authentic. Le plan est de modifier les migrations pour ne plus passer silencieusement sur cette absence, c'est dans #47699.

Ah autre souci directement lié pour le coup : ces deux extensions viennent sous Debian dans le paquet postgresql-contrib, or, seul le paquet postgresql est indiqué en suggestion du paquet authentic2.

Formats disponibles : Atom PDF