Thread: superuser unable to modify settings of a system table

superuser unable to modify settings of a system table

From
Gurjeet Singh
Date:
On PG 8.4.4 I am unable to set per-table autovacuum setting for the
pg_listener table. Being a superuser, I'd expect Postgres to allow me to do
that.

postgres=# select version();

version
-----------------------------------------------------------------------------------------------------------
 PostgreSQL 8.4.4 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 4.3.2
20081105 (Red Hat 4.3.2-7), 32-bit
(1 row)

postgres=# select user;
 current_user
--------------
 postgres
(1 row)

postgres=# alter table pg_listener set (autovacuum_vacuum_threshold=100);
ERROR:  permission denied: "pg_listener" is a system catalog
postgres=# select * from pg_user;
 usename  | usesysid | usecreatedb | usesuper | usecatupd |  passwd  |
valuntil | useconfig
----------+----------+-------------+----------+-----------+----------+----------+-----------
 postgres |       10 | t           | t        | t         | ********
|          |
(1 row)

Regards,
PS: RhodiumToad prompted me to post here.
--
gurjeet.singh
@ EnterpriseDB - The Enterprise Postgres Company
http://www.EnterpriseDB.com

singh.gurjeet@{ gmail | yahoo }.com
Twitter/Skype: singh_gurjeet

Mail sent from my BlackLaptop device

Re: superuser unable to modify settings of a system table

From
Tom Lane
Date:
Gurjeet Singh <singh.gurjeet@gmail.com> writes:
> On PG 8.4.4 I am unable to set per-table autovacuum setting for the
> pg_listener table. Being a superuser, I'd expect Postgres to allow me to do
> that.

See allow_system_table_mods.  Even superusers should think twice before
fooling with system catalogs...

            regards, tom lane

Re: superuser unable to modify settings of a system table

From
Gurjeet Singh
Date:
On Thu, Jun 3, 2010 at 1:02 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

> Gurjeet Singh <singh.gurjeet@gmail.com> writes:
> > On PG 8.4.4 I am unable to set per-table autovacuum setting for the
> > pg_listener table. Being a superuser, I'd expect Postgres to allow me to
> do
> > that.
>
> See allow_system_table_mods.  Even superusers should think twice before
> fooling with system catalogs...
>
>
:) Well, I assume a lot of thought does go into the process of altering the
system table, but when it is needed, it is really needed.

In the setup that I am handling right now, LISTEN/NOTIFY gets used a lot,
and allowing autovacuum to manage it with default settings is really counter
productive.

allow_system_table_mods needs a restart :( .Yet another parameter I wish was
changeable on the fly.

Regards,
--
gurjeet.singh
@ EnterpriseDB - The Enterprise Postgres Company
http://www.EnterpriseDB.com

singh.gurjeet@{ gmail | yahoo }.com
Twitter/Skype: singh_gurjeet

Mail sent from my BlackLaptop device

Re: superuser unable to modify settings of a system table

From
Tom Lane
Date:
Gurjeet Singh <singh.gurjeet@gmail.com> writes:
> allow_system_table_mods needs a restart :( .Yet another parameter I wish was
> changeable on the fly.

I'm not sure there's any compelling reason why it couldn't be SUSET.
Maybe a TODO ...

            regards, tom lane

Re: superuser unable to modify settings of a system table

From
Robert Haas
Date:
On Thu, Jun 3, 2010 at 1:21 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
> Gurjeet Singh <singh.gurjeet@gmail.com> writes:
>> allow_system_table_mods needs a restart :( .Yet another parameter I wish was
>> changeable on the fly.
>
> I'm not sure there's any compelling reason why it couldn't be SUSET.
> Maybe a TODO ...

Personally, I think it would be better to put some work into making
allow_system_table_mods a little less simple-minded.  Right now,
!allow_system_table_mods prohibits you from doing perfectly sensible
things (as in the OP's original example) yet still allows you to do
things that are totally nuts (like DELETE FROM pg_class, which causes
every subsequent connection attempt for that database to panic).
Perfection may be too much to ask for but I'd take "modest
improvement"...

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise Postgres Company

Re: superuser unable to modify settings of a system table

From
Tom Lane
Date:
Robert Haas <robertmhaas@gmail.com> writes:
> Personally, I think it would be better to put some work into making
> allow_system_table_mods a little less simple-minded.  Right now,
> !allow_system_table_mods prohibits you from doing perfectly sensible
> things (as in the OP's original example) yet still allows you to do
> things that are totally nuts (like DELETE FROM pg_class, which causes
> every subsequent connection attempt for that database to panic).
> Perfection may be too much to ask for but I'd take "modest
> improvement"...

Nope, that is the wrong viewpoint entirely.  allow_system_table_mods
is intended to prevent you from modifying the *structure* of the
system catalogs, which is fairly critical because the backend C code
tends to depend on that.  Modifying the *content* of the catalogs
is another matter, and in fact we let any superuser do that without
having set allow_system_table_mods.  There is no practical way to
distinguish a benign catalog-content change from a disastrous one,
so we don't try.

It's possible that reloptions is a special case and we should treat it
as being more nearly in the content than structure category.  Not sure.

            regards, tom lane

Re: superuser unable to modify settings of a system table

From
Robert Haas
Date:
On Fri, Jun 4, 2010 at 4:53 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
> Robert Haas <robertmhaas@gmail.com> writes:
>> Personally, I think it would be better to put some work into making
>> allow_system_table_mods a little less simple-minded. =A0Right now,
>> !allow_system_table_mods prohibits you from doing perfectly sensible
>> things (as in the OP's original example) yet still allows you to do
>> things that are totally nuts (like DELETE FROM pg_class, which causes
>> every subsequent connection attempt for that database to panic).
>> Perfection may be too much to ask for but I'd take "modest
>> improvement"...
>
> Nope, that is the wrong viewpoint entirely. =A0allow_system_table_mods
> is intended to prevent you from modifying the *structure* of the
> system catalogs, which is fairly critical because the backend C code
> tends to depend on that. =A0Modifying the *content* of the catalogs
> is another matter, and in fact we let any superuser do that without
> having set allow_system_table_mods. =A0There is no practical way to
> distinguish a benign catalog-content change from a disastrous one,
> so we don't try.
>
> It's possible that reloptions is a special case and we should treat it
> as being more nearly in the content than structure category. =A0Not sure.

The backend C code also depends on the critical system indexes being
present in the system catalogs, yet we still allow them to be deleted.
 Is there really a use case for users fiddling with pg_proc, pg_class,
etc. directly?

At any rate, I'd be happy to drop that part of the proposal.  It would
be a step forward just to permit (even without
allow_system_table_mods) those changes which don't alter the structure
of the catalog.  For ALTER TABLE, the SET STATISTICS, (RE)SET
(attribute_option), SET STORAGE, CLUSTER ON, SET WITHOUT CLUSTER, and
(RE)SET (reloptions) forms are all things that fall into this
category, I believe.

--=20
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise Postgres Company

Re: superuser unable to modify settings of a system table

From
Tom Lane
Date:
Robert Haas <robertmhaas@gmail.com> writes:
>  Is there really a use case for users fiddling with pg_proc, pg_class,
> etc. directly?

There's a use case for *superusers* to fiddle with them, yes.
(Superusers are presumed to be adults.)  I think I recommend a quick
UPDATE on some catalog at least once a month on the lists.

You might care to consider the fact that no modern Unix system prevents
root from doing rm -rf /, even though that's "obviously" disastrous.
Yet (stretching the analogy all out of shape) there's no convenient user
tool for rearranging the contents of all the inodes on a filesystem.

> At any rate, I'd be happy to drop that part of the proposal.  It would
> be a step forward just to permit (even without
> allow_system_table_mods) those changes which don't alter the structure
> of the catalog.  For ALTER TABLE, the SET STATISTICS, (RE)SET
> (attribute_option), SET STORAGE, CLUSTER ON, SET WITHOUT CLUSTER, and
> (RE)SET (reloptions) forms are all things that fall into this
> category, I believe.

It would be far less work to just drop allow_system_table_mods to SUSET.
And we wouldn't get questions about which forms of ALTER TABLE require
it.

            regards, tom lane

Re: superuser unable to modify settings of a system table

From
Robert Haas
Date:
On Fri, Jun 4, 2010 at 5:13 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
> Robert Haas <robertmhaas@gmail.com> writes:
>> =A0Is there really a use case for users fiddling with pg_proc, pg_class,
>> etc. directly?
>
> There's a use case for *superusers* to fiddle with them, yes.
> (Superusers are presumed to be adults.) =A0I think I recommend a quick
> UPDATE on some catalog at least once a month on the lists.
>
> You might care to consider the fact that no modern Unix system prevents
> root from doing rm -rf /, even though that's "obviously" disastrous.
> Yet (stretching the analogy all out of shape) there's no convenient user
> tool for rearranging the contents of all the inodes on a filesystem.

Sure.  I guess it boils down to how much use case you think there is
for updating system catalogs directly (rather than using DDL).  I
don't follow all the lists so I haven't seen these recommendations.

>> At any rate, I'd be happy to drop that part of the proposal. =A0It would
>> be a step forward just to permit (even without
>> allow_system_table_mods) those changes which don't alter the structure
>> of the catalog. =A0For ALTER TABLE, the SET STATISTICS, (RE)SET
>> (attribute_option), SET STORAGE, CLUSTER ON, SET WITHOUT CLUSTER, and
>> (RE)SET (reloptions) forms are all things that fall into this
>> category, I believe.
>
> It would be far less work to just drop allow_system_table_mods to SUSET.
> And we wouldn't get questions about which forms of ALTER TABLE require
> it.

I think there's some value in distinguishing between things which are
"only for adults" and things which are "almost certainly a bad idea".

--=20
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise Postgres Company

Re: superuser unable to modify settings of a system table

From
Bruce Momjian
Date:
Tom Lane wrote:
> Robert Haas <robertmhaas@gmail.com> writes:
> >  Is there really a use case for users fiddling with pg_proc, pg_class,
> > etc. directly?
>
> There's a use case for *superusers* to fiddle with them, yes.
> (Superusers are presumed to be adults.)  I think I recommend a quick
> UPDATE on some catalog at least once a month on the lists.
>
> You might care to consider the fact that no modern Unix system prevents
> root from doing rm -rf /, even though that's "obviously" disastrous.
> Yet (stretching the analogy all out of shape) there's no convenient user
> tool for rearranging the contents of all the inodes on a filesystem.
>
> > At any rate, I'd be happy to drop that part of the proposal.  It would
> > be a step forward just to permit (even without
> > allow_system_table_mods) those changes which don't alter the structure
> > of the catalog.  For ALTER TABLE, the SET STATISTICS, (RE)SET
> > (attribute_option), SET STORAGE, CLUSTER ON, SET WITHOUT CLUSTER, and
> > (RE)SET (reloptions) forms are all things that fall into this
> > category, I believe.
>
> It would be far less work to just drop allow_system_table_mods to SUSET.
> And we wouldn't get questions about which forms of ALTER TABLE require
> it.

Are we going to make the allow_system_table_mods to SUSET change?  Is it
a TODO?

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

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

Re: superuser unable to modify settings of a system table

From
Robert Haas
Date:
On Fri, Feb 4, 2011 at 10:45 PM, Bruce Momjian <bruce@momjian.us> wrote:
> Tom Lane wrote:
>> Robert Haas <robertmhaas@gmail.com> writes:
>> > =A0Is there really a use case for users fiddling with pg_proc, pg_clas=
s,
>> > etc. directly?
>>
>> There's a use case for *superusers* to fiddle with them, yes.
>> (Superusers are presumed to be adults.) =A0I think I recommend a quick
>> UPDATE on some catalog at least once a month on the lists.
>>
>> You might care to consider the fact that no modern Unix system prevents
>> root from doing rm -rf /, even though that's "obviously" disastrous.
>> Yet (stretching the analogy all out of shape) there's no convenient user
>> tool for rearranging the contents of all the inodes on a filesystem.
>>
>> > At any rate, I'd be happy to drop that part of the proposal. =A0It wou=
ld
>> > be a step forward just to permit (even without
>> > allow_system_table_mods) those changes which don't alter the structure
>> > of the catalog. =A0For ALTER TABLE, the SET STATISTICS, (RE)SET
>> > (attribute_option), SET STORAGE, CLUSTER ON, SET WITHOUT CLUSTER, and
>> > (RE)SET (reloptions) forms are all things that fall into this
>> > category, I believe.
>>
>> It would be far less work to just drop allow_system_table_mods to SUSET.
>> And we wouldn't get questions about which forms of ALTER TABLE require
>> it.
>
> Are we going to make the allow_system_table_mods to SUSET change? =A0Is it
> a TODO?

I'd rather not drop it to SUSET.  If we're going to make an effort in
this area, I'd rather do the work to distinguish the
destroy-your-database cases from the ones that are reasonable for an
admin to want to do.

I wouldn't make it a TODO, though.  We have no consensus on what, if
anything, is worth doing.

--=20
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company