Re: Why no pg_has_role(..., 'ADMIN')? - Mailing list pgsql-general

From Robert Haas
Subject Re: Why no pg_has_role(..., 'ADMIN')?
Date
Msg-id CA+TgmobvCGAHPZxX1rNgUb1cGcmD5e8ESGVSL=OyVqDYCAV3EQ@mail.gmail.com
Whole thread Raw
In response to Re: Why no pg_has_role(..., 'ADMIN')?  (Laurenz Albe <laurenz.albe@cybertec.at>)
Responses Re: Why no pg_has_role(..., 'ADMIN')?
Re: Why no pg_has_role(..., 'ADMIN')?
List pgsql-general
On Fri, Sep 20, 2024 at 12:37 PM Laurenz Albe <laurenz.albe@cybertec.at> wrote:
> > But knowing whether DROP ROLE will work,
> > w/o invalidating the current transaction,
> > seems like something quite useful to know now, no?
> >
> > I can query pg_auth_members for admin_option,
> > but only easily for direct membership. Taking into
> > account indirect membership, which I assume applies,
> > is exactly why pg_has_role() exists, no?
>
> That would be a useful addition, yes.

I think this already exists. The full list of modes supported by
pg_has_role() is listed in convert_role_priv_string(). You can do
something like pg_has_role('alice', 'USAGE WITH ADMIN OPTION'). This
is not new: it worked in older releases too, but AFAIK it's never been
mentioned in the documentation.

However, the precise rule for DROP ROLE in v16+ is not just that you
need to have ADMIN OPTION on the role. The rule is:

1. You must have ADMIN OPTION on the target role.
2. You must also have CREATEROLE.
3. If the target role is SUPERUSER, you must be SUPERUSER.

If I'm not wrong, pg_has_role(..., 'USAGE WITH ADMIN OPTION') will
test #1 for you, but not #2 or #3.

--
Robert Haas
EDB: http://www.enterprisedb.com



pgsql-general by date:

Previous
From: Laurenz Albe
Date:
Subject: Re: Why no pg_has_role(..., 'ADMIN')?
Next
From: Tom Lane
Date:
Subject: Re: Why no pg_has_role(..., 'ADMIN')?