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 14/06/2022 22:56:06

PmGs7
Membre

Résolu - pg_dump d'une table - pas clair : avec ou sans séquence?

Bonjour,
Je bute ce soir sur un problème que je n'arrive pas à expliquer.

J'ai une base avec 2 tables t1 et t2 presque identiques, comportant chacune une séquence et une seule ligne de donnée.

Le dump de la base est correct.

Le dump de la table t1 est complet (avec séquence, le dump permet de recréer cette table dans une autre base), ce qui n'est pas conforme à la doc

Le dump de la table t2 est confrome à la doc, cad sans la séquence.

Je mets ci-dessous les 3 dumps, si un lecteur a un peu de temps, j'apprécierais qu'il utilise le 1er sur son serveur t voit s'il reproduit le pb.

Par ailleurs je suis à la recherche de toute idée pour approfondir et comprendre.

Merci d'avance.

------------------------------------------ dump base
-
-- PostgreSQL database dump
--

-- Dumped from database version 11.14 (Debian 11.14-0+deb10u1)
-- Dumped by pg_dump version 11.14 (Debian 11.14-0+deb10u1)

SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;

SET default_tablespace = '';

SET default_with_oids = false;

--
-- Name: t1; Type: TABLE; Schema: public; Owner: PmGs
--

CREATE TABLE public.t1 (
    id bigint NOT NULL,
    name character varying(255) NOT NULL,
    created_at timestamp(0) without time zone,
    updated_at timestamp(0) without time zone
);


ALTER TABLE public.t1 OWNER TO PmGs;

--
-- Name: t1_id_seq; Type: SEQUENCE; Schema: public; Owner: PmGs
--

CREATE SEQUENCE public.t1_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;


ALTER TABLE public.t1_id_seq OWNER TO PmGs;

--
-- Name: t1_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: PmGs
--

ALTER SEQUENCE public.t1_id_seq OWNED BY public.t1.id;


--
-- Name: t2_id_seq; Type: SEQUENCE; Schema: public; Owner: PmGs
--

CREATE SEQUENCE public.t2_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;


ALTER TABLE public.t2_id_seq OWNER TO PmGs;

--
-- Name: t2; Type: TABLE; Schema: public; Owner: PmGs
--

CREATE TABLE public.t2 (
    id bigint DEFAULT nextval('public.t2_id_seq'::regclass) NOT NULL,
    name character varying(32),
    created_at timestamp without time zone DEFAULT now(),
    updated_at timestamp without time zone
);


ALTER TABLE public.t2 OWNER TO PmGs;

--
-- Name: t1 id; Type: DEFAULT; Schema: public; Owner: PmGs
--

ALTER TABLE ONLY public.t1 ALTER COLUMN id SET DEFAULT nextval('public.t1_id_seq'::regclass);


--
-- Data for Name: t1; Type: TABLE DATA; Schema: public; Owner: PmGs
--

COPY public.t1 (id, name, created_at, updated_at) FROM stdin;
1    Admin    2022-06-11 20:28:33    2022-06-11 20:28:33
\.


--
-- Data for Name: t2; Type: TABLE DATA; Schema: public; Owner: PmGs
--

COPY public.t2 (id, name, created_at, updated_at) FROM stdin;
1    xxx    \N    \N
\.


--
-- Name: t1_id_seq; Type: SEQUENCE SET; Schema: public; Owner: PmGs
--

SELECT pg_catalog.setval('public.t1_id_seq', 1, true);


--
-- Name: t2_id_seq; Type: SEQUENCE SET; Schema: public; Owner: PmGs
--

SELECT pg_catalog.setval('public.t2_id_seq', 31, true);


--
-- Name: t1 t1_pkey; Type: CONSTRAINT; Schema: public; Owner: PmGs
--

ALTER TABLE ONLY public.t1
    ADD CONSTRAINT t1_pkey PRIMARY KEY (id);


--
-- Name: t2 t2_pkey; Type: CONSTRAINT; Schema: public; Owner: PmGs
--

ALTER TABLE ONLY public.t2
    ADD CONSTRAINT t2_pkey PRIMARY KEY (id);


--
-- PostgreSQL database dump complete
--

---------------------------------- dump table t1
--
-- PostgreSQL database dump
--

-- Dumped from database version 11.14 (Debian 11.14-0+deb10u1)
-- Dumped by pg_dump version 11.14 (Debian 11.14-0+deb10u1)

SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;

SET default_tablespace = '';

SET default_with_oids = false;

--
-- Name: t1; Type: TABLE; Schema: public; Owner: PmGs
--

CREATE TABLE public.t1 (
    id bigint NOT NULL,
    name character varying(255) NOT NULL,
    created_at timestamp(0) without time zone,
    updated_at timestamp(0) without time zone
);


ALTER TABLE public.t1 OWNER TO PmGs;

--
-- Name: t1_id_seq; Type: SEQUENCE; Schema: public; Owner: PmGs
--

CREATE SEQUENCE public.t1_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;


ALTER TABLE public.t1_id_seq OWNER TO PmGs;

--
-- Name: t1_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: PmGs
--

ALTER SEQUENCE public.t1_id_seq OWNED BY public.t1.id;


--
-- Name: t1 id; Type: DEFAULT; Schema: public; Owner: PmGs
--

ALTER TABLE ONLY public.t1 ALTER COLUMN id SET DEFAULT nextval('public.t1_id_seq'::regclass);


--
-- Data for Name: t1; Type: TABLE DATA; Schema: public; Owner: PmGs
--

COPY public.t1 (id, name, created_at, updated_at) FROM stdin;
1    Admin    2022-06-11 20:28:33    2022-06-11 20:28:33
\.


--
-- Name: t1_id_seq; Type: SEQUENCE SET; Schema: public; Owner: PmGs
--

SELECT pg_catalog.setval('public.t1_id_seq', 1, true);


--
-- Name: t1 t1_pkey; Type: CONSTRAINT; Schema: public; Owner: PmGs
--

ALTER TABLE ONLY public.t1
    ADD CONSTRAINT t1_pkey PRIMARY KEY (id);


--
-- PostgreSQL database dump complete
--

---------------------------- dump table t2
--
-- PostgreSQL database dump
--

-- Dumped from database version 11.14 (Debian 11.14-0+deb10u1)
-- Dumped by pg_dump version 11.14 (Debian 11.14-0+deb10u1)

SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;

SET default_tablespace = '';

SET default_with_oids = false;

--
-- Name: t2; Type: TABLE; Schema: public; Owner: PmGs
--

CREATE TABLE public.t2 (
    id bigint DEFAULT nextval('public.t2_id_seq'::regclass) NOT NULL,
    name character varying(32),
    created_at timestamp without time zone DEFAULT now(),
    updated_at timestamp without time zone
);


ALTER TABLE public.t2 OWNER TO PmGs;

--
-- Data for Name: t2; Type: TABLE DATA; Schema: public; Owner: PmGs
--

COPY public.t2 (id, name, created_at, updated_at) FROM stdin;
1    xxx    \N    \N
\.


--
-- Name: t2 t2_pkey; Type: CONSTRAINT; Schema: public; Owner: PmGs
--

ALTER TABLE ONLY public.t2
    ADD CONSTRAINT t2_pkey PRIMARY KEY (id);


--
-- PostgreSQL database dump complete
--

Dernière modification par PmGs7 (15/06/2022 09:36:14)

Hors ligne

#2 15/06/2022 04:58:21

rjuju
Administrateur

Re : Résolu - pg_dump d'une table - pas clair : avec ou sans séquence?

Bonjour,


je n'ai pas tout compris.  Comment avez-vous générés les 3 dumps en questions, quel comportement exactement n'est pas ou est conforme à la doc (et où dans la doc?)?

Hors ligne

#3 15/06/2022 07:42:11

PmGs7
Membre

Re : Résolu - pg_dump d'une table - pas clair : avec ou sans séquence?

Bonjour,


Merci pour votre réponse.


La cmd pour générées les dump est la "standard" à savoir :

    pg_dump mabase
    pg_dump -t t1 mabase
    pg_dump -t t2 mabase


La doc est celle de la version 11
    https://www.postgresql.org/docs/11/app-pgdump.html
Note
When -t is specified, pg_dump makes no attempt to dump any other database objects that the selected table(s) might depend upon.


Le dump de t1 n'est, selon moi, pas conforme à la doc.

Ce n'est pas un pb majeur, mais ennuyeux/plus compliqué pour réaliser un script.


PS : il semble que la différence de comportement soit liée à la différence de codage du "default" dans la séquence ( t1 : "alter" sur la table créée, t2 : directement avec la création de la table)

Dernière modification par PmGs7 (15/06/2022 07:47:02)

Hors ligne

#4 15/06/2022 08:59:32

gleu
Administrateur

Re : Résolu - pg_dump d'une table - pas clair : avec ou sans séquence?

Pour moi, la doc est conforme. Il y a une grosse différence entre t1/t1_id_seq et t2/t2_id_seq : la séquence t1_id_seq appartient à la table t1 alors que la séquence t2_id_seq n'appartient pas à la table t2. Vous avez dû créer la table t1 avec un serial, ce qui crée une séquence et surtout une dépendance de la colonne id de la table t1 et de sa séquence, ce que vous n'avez pas dû faire avec la table t2. Cela se voit avec l'instruction "ALTER SEQUENCE public.t1_id_seq OWNED BY public.t1.id;" qui n'existe que pour la table t1.

Bref, les deux tables sont différentes, ce qui génère un dump différent. Rien de plus normal.


Guillaume.

Hors ligne

#5 15/06/2022 08:59:33

rjuju
Administrateur

Re : Résolu - pg_dump d'une table - pas clair : avec ou sans séquence?

Je vois.


Le comportement est à priori correct, car la sequence pour t1 n'est pas une dépendance mais une "extension" de la table, la séquence étant détenue par la table.  L'idée étant que la sauvegarde type "pg_dump -t t" avec:

CREATE TABLE t(id serial);

Donne le même résultat que la création originale.  Les choses sont probablement beaucoup plus claires depuis les nouvelles versions et la clause "GENERATED ALWAYS AS IDENTITY", mais la signification est la même, (big)serial est simplement une version non standard pour la même chose.


J'imagine que lorsque vous avez créé t2, vous n'avez pas effectué

ALTER SEQUENCE public.t2_id_seq OWNED BY public.t2.id;

ce qui fait que les deux objets sont effectivements uniquement dépendant l'un de l'autre mais pas un même objet logique.

Hors ligne

#6 15/06/2022 09:00:03

gleu
Administrateur

Re : Résolu - pg_dump d'une table - pas clair : avec ou sans séquence?

Comme j'ai gratté rjuju d'une minute :-D


Guillaume.

Hors ligne

#7 15/06/2022 09:06:09

rjuju
Administrateur

Re : Résolu - pg_dump d'une table - pas clair : avec ou sans séquence?

Une seconde tu veux dire smile

Hors ligne

#8 15/06/2022 09:17:30

PmGs7
Membre

Re : Résolu - pg_dump d'une table - pas clair : avec ou sans séquence?

Merci @rjuju et @gleu

j'ai compris la raison "la sequence pour t1 n'est pas une dépendance mais une "extension" de la table"

C'est clair, mais en l'occurrence la doc, selon moi, l'est moins car n'évoque pas ce comportement différent entre "extension" et dépendance.

Comment cloture-t-on un sujet sur ce forum?

Hors ligne

#9 15/06/2022 09:27:42

gleu
Administrateur

Re : Résolu - pg_dump d'une table - pas clair : avec ou sans séquence?

Pas besoin de clôturer. (certains changent le titre du thread pour l'indiquer mais ça n'a vraiment aucune importance)


Guillaume.

Hors ligne

#10 15/06/2022 09:35:49

PmGs7
Membre

Re : Résolu - pg_dump d'une table - pas clair : avec ou sans séquence?

"ça n'a vraiment aucune importance)"

A titre personnel je trouve que c'est mieux pour les 2 profils, ceux qui recherchent de l'aide ou ceux qui  souhaitent en apporter.

Hors ligne

Pied de page des forums