Vous n'êtes pas identifié(e).
Pages : 1
Bonjour à tous,
J'ai besoin de vos connaissances concernant une problématique qui permet de corrompre une table :
- la suppression manuelle d'une valeur d'énum dans le catalogue pg_enum avec une requête de cette sorte :
delete from pg_enum where enumtypid = 1135484 and enumsortorder = 3;
select * from mytable;
ERROR: invalid internal value for enum: 1135490
Ce que je sais :
- Il faut absoluement éviter de modifier manuellement un cataolgue
- Les colonnes d'un type enum stocke en réalité l'oid de du record associé du catalogue pg_énum ce qui fait que lors d'une supression d'une valeur d'énum encore utilisé on obtient une erreur et lorsque on rajoute la valeur d'énum dans pg_enum on obtient également une erreur.
- Lorsque oid est pair les valeurs sont garanties triées.
- Lorsque oid est impair les valeurs ne sont pas garanties triées.
Ce que je voudrais savoir :
- Dans quel cas pourrais-je avoir un oid impair dans pg_enum (car je pense que les énum sont tous triés)?
- Qu'est ce qu'il y a lieu de faire pour récupérer ma table corrompue par une suppression manuelle (delete) dans pg_enum?
- un autre insert quelconque?
- modification des fichiers binaires des données de la table?
- autre chose?
Merci pour vos réponses !
Dernière modification par adrien1 (24/07/2017 13:53:43)
Hors ligne
Insérer la ligne ne suffira pas car vous ne pourrez pas indiquer le bon numéro d'OID pour cette nouvelle ligne dans pg_enum. La seule solution que je vois actuellement, c'est de reprendre la dernière sauvegarde.
Guillaume.
Hors ligne
Merci pour ta réponse gleu !
une idée concernant cette question :
- Dans quel cas pourrais-je avoir un oid impair dans pg_enum (car je pense que les énum sont tous triés)?
Hors ligne
Je ne sais pas.
Guillaume.
Hors ligne
Je n'ai pas regardé le code, mais après un test rapide vous obtenez un oid impair en ajoutant une valeur dans l'enum après coup (par exemple ALTER TYPE ... ADD VALUE '...' AFTER '...')
Julien.
https://rjuju.github.io/
Hors ligne
Pages : 1