PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 24/07/2017 13:53:00

adrien1
Membre

suppression de valeur d'énum - table corrompue

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

#2 24/07/2017 14:07:54

gleu
Administrateur

Re : suppression de valeur d'énum - table corrompue

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

#3 25/07/2017 14:26:02

adrien1
Membre

Re : suppression de valeur d'énum - table corrompue

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

#4 25/07/2017 21:30:26

gleu
Administrateur

Re : suppression de valeur d'énum - table corrompue

Je ne sais pas.


Guillaume.

Hors ligne

#5 26/07/2017 13:10:51

rjuju
Administrateur

Re : suppression de valeur d'énum - table corrompue

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 '...')

Hors ligne

Pied de page des forums