Обсуждение: renaming+recreating table w/default sequence causes dependency seq issue

Поиск
Список
Период
Сортировка

renaming+recreating table w/default sequence causes dependency seq issue

От
Todd Kover
Дата:
I saw issues around renaming tables and not renaming sequences in the TODO
list but did not see anything about this.  Apologies if I missed it.

This is with a 9.1.4 server (enterprisedb download on mac os/x lion) and also
seen on 9.1.3 built from netbsd pkgsrc.

It appears that something is amiss if you try to drop a table that has been
renamed that used to have a default mapping to a sequence:

Given this:
---<snip>---
drop table IF EXISTS foo;
drop table IF EXISTS foo_v26;

create table foo (id serial not null, bar integer );
alter table foo alter column id drop default;

alter table foo rename to foo_v26;

create table foo (id integer not null, bar integer );

alter table foo alter id SET DEFAULT nextval('foo_id_seq');

drop table foo_v26;
---<snip>---

everthing works as expected until the final drop, which says:

jazzhands=> drop table foo_v26;
ERROR:  cannot drop table foo_v26 because other objects depend on it
DETAIL:  default for table foo column id depends on sequence foo_id_seq
HINT:  Use DROP ... CASCADE to drop the dependent objects too.

however...

jazzhands=> \d foo;
                         Table "public.foo"
 Column |  Type   |                    Modifiers
--------+---------+--------------------------------------------------
 id     | integer | not null default nextval('foo_id_seq'::regclass)

jazzhands=> \d foo_v26;
    Table "public.foo_v26"
 Column |  Type   | Modifiers
--------+---------+-----------
 id     | integer | not null

Interestingly, I can drop table foo without any complaints.

It seems like the dependency did not move (it also seems like its
backwards but that's probably all me).

Sadly, if I move setting the default to after I drop the old table, the
sequence goes away, so I am still digging into a work around.

thanks,
-Todd

Re: renaming+recreating table w/default sequence causes dependency seq issue

От
Alvaro Herrera
Дата:
Excerpts from Todd Kover's message of mar ago 07 20:10:25 -0400 2012:

> Given this:
> ---<snip>---
> drop table IF EXISTS foo;
> drop table IF EXISTS foo_v26;
>=20
> create table foo (id serial not null, bar integer );
> alter table foo alter column id drop default;
>=20
> alter table foo rename to foo_v26;
>=20
> create table foo (id integer not null, bar integer );
>=20
> alter table foo alter id SET DEFAULT nextval('foo_id_seq');
>=20
> drop table foo_v26;
> ---<snip>---
>=20
> everthing works as expected until the final drop, which says:
>=20
> jazzhands=3D> drop table foo_v26;
> ERROR:  cannot drop table foo_v26 because other objects depend on it
> DETAIL:  default for table foo column id depends on sequence foo_id_seq
> HINT:  Use DROP ... CASCADE to drop the dependent objects too.

I think you need an ALTER SEQUENCE .. OWNED BY to fix up dependencies
for the sequence.

--=20
=C3=81lvaro Herrera                http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

Re: renaming+recreating table w/default sequence causes dependency seq issue

От
Tom Lane
Дата:
Todd Kover <kovert@omniscient.com> writes:
> I saw issues around renaming tables and not renaming sequences in the TODO
> list but did not see anything about this.  Apologies if I missed it.

> This is with a 9.1.4 server (enterprisedb download on mac os/x lion) and also
> seen on 9.1.3 built from netbsd pkgsrc.

> It appears that something is amiss if you try to drop a table that has been
> renamed that used to have a default mapping to a sequence:

> Given this:
> ---<snip>---
> drop table IF EXISTS foo;
> drop table IF EXISTS foo_v26;

> create table foo (id serial not null, bar integer );
> alter table foo alter column id drop default;

> alter table foo rename to foo_v26;

> create table foo (id integer not null, bar integer );

> alter table foo alter id SET DEFAULT nextval('foo_id_seq');

> drop table foo_v26;
> ---<snip>---

> everthing works as expected until the final drop, which says:

> jazzhands=> drop table foo_v26;
> ERROR:  cannot drop table foo_v26 because other objects depend on it
> DETAIL:  default for table foo column id depends on sequence foo_id_seq
> HINT:  Use DROP ... CASCADE to drop the dependent objects too.

I don't see any bug there.  The ALTER DROP DEFAULT command does not
remove the sequence's dependence on foo.id; nor for that matter does
ALTER SET DEFAULT create an auto-drop dependency on the new table.
See ALTER SEQUENCE OWNED BY if you want to dissociate a serial column's
sequence from the column, or reattach it to another column.

Formally speaking, a "serial column" is shorthand for creating an
integer (or bigint) column, creating a sequence, associating them
as though by ALTER SEQUENCE OWNED BY, and setting the column's default
to nextval('sequence-name').

            regards, tom lane

Re: renaming+recreating table w/default sequence causes dependency seq issue

От
Todd Kover
Дата:
> I don't see any bug there.  The ALTER DROP DEFAULT command does not
 > remove the sequence's dependence on foo.id; nor for that matter
 > does ALTER SET DEFAULT create an auto-drop dependency on the new
 > table.  See ALTER SEQUENCE OWNED BY if you want to dissociate a
 > serial column's sequence from the column, or reattach it to another
 > column.
 >
 > Formally speaking, a "serial column" is shorthand for creating an
 > integer (or bigint) column, creating a sequence, associating them as
 > though by ALTER SEQUENCE OWNED BY, and setting the column's default
 > to nextval('sequence-name').

I stand corrected.  It would be nice if \ds or \ds+ or something showed
this relationship so it was evident.  That's more of a feature request
than a bug fix tho.

apologies for the misdirection.

-Todd