Development #50462
crash sur fonction immutable_unaccent absente
0%
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
Historique
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 ?
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 ?
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)
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 :/
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.
Mis à jour par Benjamin Dauvergne il y a environ 3 ans
- Assigné à mis à Benjamin Dauvergne
Je prends.
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.
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é.
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
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
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 ?
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.
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à).
Mis à jour par Benjamin Dauvergne il y a environ 3 ans
- Fichier 0001-misc-add-migration-to-fix-absence-of-immutable_unacc.patch 0001-misc-add-migration-to-fix-absence-of-immutable_unacc.patch ajouté
- Tracker changé de Bug à Development
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
ok.
Mis à jour par Benjamin Dauvergne il y a environ 3 ans
Mis à jour par Benjamin Dauvergne il y a environ 3 ans
- Fichier 0001-misc-add-migration-to-fix-absence-of-immutable_unacc.patch 0001-misc-add-migration-to-fix-absence-of-immutable_unacc.patch ajouté
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.
Mis à jour par Benjamin Dauvergne il y a environ 3 ans
- 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
Mis à jour par Benjamin Dauvergne il y a environ 3 ans
sictiam-prod le problème n'est pas présent non plus.
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)
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)
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'.
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
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)
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 ?
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.
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.
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.
misc: add migration to fix absence of immutable_unaccent() (#50462)