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 29/07/2022 17:56:34

albourg
Membre

copier une table

Bonjour,

je voudrais exporter une table nommée "bievent' (d'un vieux postgres 9.2) pour l'importer dans une db de test.
Mon user n'a accès qu'en lecture mais pas en écriture (production).

PGPASSWORD=<mon passwd> pg_dump -f /tmp/lz.dmp -O -t bievent -h 127.0.0.1 -p 5433 -U <monuser> <database>

Mais j'obtiens

pg_dump: [archiver (db)] query failed: ERROR:  permission denied for relation bievent_id_seq
pg_dump: [archiver (db)] query was: SELECT sequence_name, start_value, increment_by, CASE WHEN increment_by > 0 AND max_value = 9223372036854775807 THEN NULL      WHEN increment_by < 0 AND max_value = -1 THEN NULL      ELSE max_value END AS max_value, CASE WHEN increment_by > 0 AND min_value = 1 THEN NULL      WHEN increment_by < 0 AND min_value = -9223372036854775807 THEN NULL      ELSE min_value END AS min_value, cache_value, is_cycled FROM bievent_id_seq

Bref, il ne peut pas lire la séquence bievent_id_seq (qui donne l'id de la table) , refuse de faire un dump, mais ce n'est pas la séquence que je veux exporter mais bien la table.
J'ai essayé sans succès:
* d'ajouter -a
* d'ajouter --inserts
* d'ajouter -T  bievent_id_seq

Comment puis-je faire pour n'exporter QUE la table?

Merci.

Hors ligne

#2 30/07/2022 11:48:47

gleu
Administrateur

Re : copier une table

La séquence appartient à la table, et de ce fait, elles sont indissociables. Je ne vois que deux solutions :

1. supprimer le lien entre la séquence et la table ("alter sequence bievent_id_seq owned by none").

2. donner le droit de lecture sur la séquence ("grant select on sequence bievent_id_seq to <monuser>").

Grosse préférence pour la 2.


Guillaume.

Hors ligne

#3 30/07/2022 15:14:26

rjuju
Administrateur

Re : copier une table

+1 avec gleu

Hors ligne

#4 30/07/2022 21:20:50

dverite
Membre

Re : copier une table

Effectivement, il semble qu'on ne puisse pas dire à pg_dump de ne pas lire les séquences liées quand on extrait le contenu d'une table, mais on peut utiliser plus simplement COPY pour exporter le contenu de la table (ce que fait d'ailleurs pg_dump, avec plein d'autres choses qui ne vous intéressent pas dans le cas présent), sans avoir aucun droit sur les séquences liées.

psql [options] -c 'COPY nomtable TO STDOUT' > export-table.sql

Si la table est déjà créée dans la base cible, le contenu peut se recharger dans cette base avec la commande en sens inverse:

psql [options] -c '\copy nomtable FROM export-table.sql'

Si la structure de la table n'existe pas déjà dans la base cible et qui faut l'extraire au préalable de la base source, c'est faisable avec

pg_dump [options] -s -t nomtable  > structure-table.sql

qui est utilisable avec un compte en lecture seule sans droit d'accès aux séquences liées à la table.

Hors ligne

Pied de page des forums