Thread: Clarify 'dependent objects' for DROP COLUMN

Clarify 'dependent objects' for DROP COLUMN

From
Robins
Date:
Hi,

ALTER TABLE in postgresql.org/docs/devel/ says:

RESTRICT: Refuse to drop the column or constraint if there are any dependent objects. This is the default behavior.

Could someone confirm whether 'dependent objects' also includes SEQUENCES? i.e. if I create a sequence OWNED BY tbl.col1 and then try to drop the column with RESTRICT, should it allow this DROP? Currently it does, but by reading that line it seemed it shouldn't.

Thanks
---
Robins Tharakan

Re: Clarify 'dependent objects' for DROP COLUMN

From
Bruce Momjian
Date:
On Tue, Mar 12, 2013 at 09:51:44AM +0530, Robins wrote:
> Hi,
>
> ALTER TABLE in postgresql.org/docs/devel/ says:
>
> RESTRICT: Refuse to drop the column or constraint if there are any dependent
> objects. This is the default behavior.
>
> Could someone confirm whether 'dependent objects' also includes SEQUENCES? i.e.
> if I create a sequence OWNED BY tbl.col1 and then try to drop the column with
> RESTRICT, should it allow this DROP? Currently it does, but by reading that
> line it seemed it shouldn't.

I had to dig a little bit on this.  The "dependent" object would be the
removal of the constraint depending on the sequence.  Here is an
example:

    test=> create table test (x serial);
    CREATE TABLE
    test=> \d test
                             Table "public.test"
     Column |  Type   |                    Modifiers
    --------+---------+--------------------------------------------------
     x      | integer | not null default nextval('test_x_seq'::regclass)

    test=> \ds
                 List of relations
     Schema |    Name    |   Type   |  Owner
    --------+------------+----------+----------
     public | test_x_seq | sequence | postgres
    (1 row)

-->    test=> drop sequence test_x_seq;
    ERROR:  cannot drop sequence test_x_seq because other objects depend on it
    DETAIL:  default for table test column x depends on sequence test_x_seq
    HINT:  Use DROP ... CASCADE to drop the dependent objects too.
-->    test=> drop sequence test_x_seq cascade;
    NOTICE:  drop cascades to default for table test column x
    DROP SEQUENCE
    test=> \d test
         Table "public.test"
     Column |  Type   | Modifiers
    --------+---------+-----------
     x      | integer | not null

If this does not answer your questions, please post queries showing the
problem.   Thanks.

--
  Bruce Momjian  <bruce@momjian.us>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + It's impossible for everything to be true. +


Re: Clarify 'dependent objects' for DROP COLUMN

From
robins
Date:
Thanks Bruce.

I think by using the word 'constraint' I understand what the documentation meant. 

Both my queries (samples given below) arose from the fact that although there was a 'relation', this is probably not what the documentation was talking about.

Q1:
postgres=# CREATE TABLE serialTest3 (f1 bigint);
CREATE TABLE
postgres=# CREATE SEQUENCE seq4 OWNED BY serialTest3.f1;
CREATE SEQUENCE
postgres=# DROP SEQUENCE seq4;
DROP SEQUENCE
postgres=# 


Q2:
postgres=# CREATE TABLE serialTest3 (f1 bigint);
CREATE TABLE
postgres=# CREATE SEQUENCE seq4 OWNED BY serialTest3.f1;
CREATE SEQUENCE
postgres=# ALTER TABLE serialTest3 DROP COLUMN f1 RESTRICT;
ALTER TABLE
postgres=# 

I was working on some regression tests and then just wanted to be sure that this (Q2 in particular) was perfectly legal, before adding checks for them.

Thanks again.
--
Robins
Tharakan


---------- Forwarded message ----------

I had to dig a little bit on this.  The "dependent" object would be the
removal of the constraint depending on the sequence.  Here is an
example:

        test=> create table test (x serial);
        CREATE TABLE
        test=> \d test
                                 Table "public.test"
         Column |  Type   |                    Modifiers
        --------+---------+--------------------------------------------------
         x      | integer | not null default nextval('test_x_seq'::regclass)

        test=> \ds
                     List of relations
         Schema |    Name    |   Type   |  Owner
        --------+------------+----------+----------
         public | test_x_seq | sequence | postgres
        (1 row)

-->     test=> drop sequence test_x_seq;
        ERROR:  cannot drop sequence test_x_seq because other objects depend on it
        DETAIL:  default for table test column x depends on sequence test_x_seq
        HINT:  Use DROP ... CASCADE to drop the dependent objects too.
-->     test=> drop sequence test_x_seq cascade;
        NOTICE:  drop cascades to default for table test column x
        DROP SEQUENCE
        test=> \d test
             Table "public.test"
         Column |  Type   | Modifiers
        --------+---------+-----------
         x      | integer | not null

If this does not answer your questions, please post queries showing the
problem.   Thanks.

Re: Clarify 'dependent objects' for DROP COLUMN

From
Bruce Momjian
Date:
On Thu, Mar 14, 2013 at 03:38:42AM +0530, robins wrote:
> Thanks Bruce.
>
> I think by using the word 'constraint' I understand what the documentation
> meant.
>
> Both my queries (samples given below) arose from the fact that although there
> was a 'relation', this is probably not what the documentation was talking
> about.
>
> Q1:
> postgres=# CREATE TABLE serialTest3 (f1 bigint);
> CREATE TABLE
> postgres=# CREATE SEQUENCE seq4 OWNED BY serialTest3.f1;
> CREATE SEQUENCE
> postgres=# DROP SEQUENCE seq4;
> DROP SEQUENCE
> postgres=#
>
>
> Q2:
> postgres=# CREATE TABLE serialTest3 (f1 bigint);
> CREATE TABLE
> postgres=# CREATE SEQUENCE seq4 OWNED BY serialTest3.f1;
> CREATE SEQUENCE
> postgres=# ALTER TABLE serialTest3 DROP COLUMN f1 RESTRICT;
> ALTER TABLE
> postgres=#
>
> I was working on some regression tests and then just wanted to be sure that
> this (Q2 in particular) was perfectly legal, before adding checks for them.

It seems like the OWNED BY only handles auto-drop, rather than sequence
removal restrictions:

      The <literal>OWNED BY</literal> option causes the sequence to be
      associated with a specific table column, such that if that column
      (or its whole table) is dropped, the sequence will be automatically
      dropped as well.  The specified table must have the same owner and be in
      the same schema as the sequence.
      <literal>OWNED BY NONE</literal>, the default, specifies that there
      is no such association.

Seems it is not the same as actually referencing the sequence in the table.

--
  Bruce Momjian  <bruce@momjian.us>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + It's impossible for everything to be true. +