From: | Антон Глушаков <a(dot)glushakov86(at)gmail(dot)com> |
---|---|
To: | pgsql-admin(at)lists(dot)postgresql(dot)org |
Subject: | order of pg_dump command "create sequence" |
Date: | 2025-06-06 09:15:45 |
Message-ID: | CAHnOmadVj0y982EqT9sEvszjcKikysWtSrX88OvknP0W0poDkQ@mail.gmail.com |
Views: | Whole Thread | Raw Message | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-admin |
Hi, I found a peculiarity of pg_dump's work with sequences when they are
not explicitly linked to a table.
I encountered a situation (clearly abnormal use of sequences, but Postgres
does not prohibit it) in which restoring from a dump becomes impossible due
to the violation of the order of commands.
Example:
/* create simple sequence */
CREATE SEQUENCE public.my_seq;
/* create a function that will move the sequence */
CREATE FUNCTION public.gen_id() RETURNS character varying
LANGUAGE sql IMMUTABLE AS
$$
SELECT 'PREFIX_'||nextval('public.my_seq'::regclass)::VARCHAR;
$$;
/* table, the column of which will call the function */
CREATE TABLE public.exp_table (id character varying(13) GENERATED ALWAYS AS
(public.gen_id()) STORED NOT NULL);
If you make a pg_dump of the created , the sequence in dump of actions will
be as follows:
1) Creating a function "CREATE FUNCTION public.gen_id()"
2) Creating a table "CREATE TABLE public.exp_table"
3) Creating a sequence "CREATE SEQUENCE public.my_seq"
And here the problems begin.
If we try to restore the table structure from the dump, we get the expected
error
"ERROR: relation "public.my_seq" does not exist
LINE 2: SELECT 'PREFIX_'||nextval('public.my_seq'::regclass)::VARCHAR;
^
QUERY:
SELECT 'PREFIX_'||nextval('public.my_seq'::regclass)::VARCHAR;
CONTEXT: SQL function "gen_id" during startup"
It turns out that Postgres does not know that the sequence is associated
with the table and places the code for creating it after the code for
creating the table.
A workaround for this particular case is to change the name of the sequence
so that it appears higher in the dump (according to alphabetical order, for
example rename it to "a_my_seq") and then pg_dump will place the creation
of the sequence before the table, and the restore will be successful.
Whether this is a bug or a feature that you need to know about, I can't
say, but such problems can cause, for example, an error during an upgrade
or logical replication, when you need to dump and restore the data schema.
From | Date | Subject | |
---|---|---|---|
Next Message | David G. Johnston | 2025-06-06 13:54:07 | Re: order of pg_dump command "create sequence" |
Previous Message | Sbob | 2025-06-05 14:01:02 | Failed to download metadata for repo 'pgdg-common' |