Re: why can't a table be part of the same publication as its schema - Mailing list pgsql-hackers

From Alvaro Herrera
Subject Re: why can't a table be part of the same publication as its schema
Date
Msg-id 20220919151627.ah6dhz7me4uiooz3@alvherre.pgsql
Whole thread Raw
In response to RE: why can't a table be part of the same publication as its schema  ("houzj.fnst@fujitsu.com" <houzj.fnst@fujitsu.com>)
Responses Re: why can't a table be part of the same publication as its schema
Re: why can't a table be part of the same publication as its schema
List pgsql-hackers
> diff --git a/doc/src/sgml/logical-replication.sgml b/doc/src/sgml/logical-replication.sgml
> index 1ae3287..0ab768d 100644
> --- a/doc/src/sgml/logical-replication.sgml
> +++ b/doc/src/sgml/logical-replication.sgml
> @@ -1120,6 +1120,11 @@ test_sub=# SELECT * FROM child ORDER BY a;
>    </para>
>  
>    <para>
> +   Specifying a column list when the publication also publishes
> +   <literal>FOR ALL TABLES IN SCHEMA</literal> is not supported.
> +  </para>
> +
> +  <para>
>     For partitioned tables, the publication parameter
>     <literal>publish_via_partition_root</literal> determines which column list
>     is used. If <literal>publish_via_partition_root</literal> is
> 
> diff --git a/doc/src/sgml/ref/create_publication.sgml b/doc/src/sgml/ref/create_publication.sgml
> index 0a68c4b..0ced7da 100644
> --- a/doc/src/sgml/ref/create_publication.sgml
> +++ b/doc/src/sgml/ref/create_publication.sgml
> @@ -103,17 +103,17 @@ CREATE PUBLICATION <replaceable class="parameter">name</replaceable>
>       </para>
>  
>       <para>
> +      Specifying a column list when the publication also publishes
> +      <literal>FOR ALL TABLES IN SCHEMA</literal> is not supported.
> +     </para>
> 
> @@ -733,6 +694,24 @@ CheckPubRelationColumnList(List *tables, const char *queryString,
>              continue;
>  
>          /*
> +         * Disallow specifying column list if any schema is in the
> +         * publication.
> +         *
> +         * XXX We could instead just forbid the case when the publication
> +         * tries to publish the table with a column list and a schema for that
> +         * table. However, if we do that then we need a restriction during
> +         * ALTER TABLE ... SET SCHEMA to prevent such a case which doesn't
> +         * seem to be a good idea.
> +         */
> +        if (publish_schema)
> +            ereport(ERROR,
> +                    errcode(ERRCODE_INVALID_PARAMETER_VALUE),
> +                    errmsg("cannot use publication column list for relation \"%s.%s\"",
> +                           get_namespace_name(RelationGetNamespace(pri->relation)),
> +                           RelationGetRelationName(pri->relation)),
> +                    errdetail("Column list cannot be specified if any schema is part of the publication or specified
inthe list."));
 
> +

This seems a pretty arbitrary restriction.  It feels like you're adding
this restriction precisely so that you don't have to write the code to
reject the ALTER .. SET SCHEMA if an incompatible configuration is
detected.  But we already have such checks in several cases, so I don't
see why this one does not seem a good idea.

The whole FOR ALL TABLES IN SCHEMA thing seems pretty weird in several
aspects.  Others have already commented about the syntax, which is
unlike what GRANT uses; I'm also surprised that we've gotten away with
it being superuser-only.  Why are we building more superuser-only
features in this day and age?  I think not even FOR ALL TABLES should
require superuser.

-- 
Álvaro Herrera         PostgreSQL Developer  —  https://www.EnterpriseDB.com/
Thou shalt study thy libraries and strive not to reinvent them without
cause, that thy code may be short and readable and thy days pleasant
and productive. (7th Commandment for C Programmers)



pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: Free list same_input_transnos in preprocess_aggref
Next
From: Matthias van de Meent
Date:
Subject: Re: Pruning never visible changes