Re: BUG #14242: Role with a setconfig "role" setting to a nonexistent role causes pg_upgrade to fail

Поиск
Список
Период
Сортировка
От David G. Johnston
Тема Re: BUG #14242: Role with a setconfig "role" setting to a nonexistent role causes pg_upgrade to fail
Дата
Msg-id CAKFQuwaFyETaE8gF2DCBYyjCT9Cb2AKiHjuSkbv3_UJrVP02Jw@mail.gmail.com
обсуждение исходный текст
Ответ на Re: BUG #14242: Role with a setconfig "role" setting to a nonexistent role causes pg_upgrade to fail  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-bugs
On Mon, Jul 11, 2016 at 7:12 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

> "David G. Johnston" <david.g.johnston@gmail.com> writes:
> >> bossartn@amazon.com <javascript:;> writes:
> >>> 2. As foo, execute "alter role foo set role =3D 'foo'"
>
> > I'm at a loss to understand what this does when it isn't broken.
> Assuming
> > valid grants does the user become the assigned role upon session startu=
p?
>
> As written it does nothing much.  But "SET ROLE" is defined by the SQL
> standard, and what I'd expect this to do is execute an implicit SET ROLE
> at login.  Whether that's a good idea is pretty debatable, though, thus
> my question whether we'd not be better off to forbid this
> =E2=80=8B.
>

=E2=80=8BSo, I just tested and we indeed do (9.6beta-2=E2=80=8B) make the e=
ffective role
the value associated with the "ROLE" configuration variable associated to
the user.

CREATE ROLE loginrole WITH LOGIN PASSWORD 'password';
CREATE ROLE grouprole;
GRANT grouprole TO loginrole
ALTER ROLE loginrole SET ROLE TO grouprole
=E2=80=8Bpsql -U loginrole postgres
SELECT current_role; --> grouprole=E2=80=8B

=E2=80=8B=E2=80=8BI'd say that the expression "SET ROLE" as defined does no=
t match any of
the valid variations of ALTER ROLE that we've documented (i.e., ROLE is not
a "configuration_parameter").  We should document it explicitly.

ALTER ROLE { role_specification | ALL } [ IN DATABASE database_name ] SET
ROLE { TO | =3D } role_identifier
Does the standard provide guidance on the syntax for the equivalent of
"RESET ROLE"?

"The role_identifier in the <third> variant is used in conjunction with the
SET ROLE SQL command and causes a newly connected session to switch to the
named role.  If for some reason the named role no longer exists - which can
happen if it is renamed or removed - future attempts to login will provoke
a WARNING and the original user will remain active.  Note that this role
change happens after all configuration_parameters for the original role
have been setup - no configurations attached to the target role are applied=
.

role_identifier:
The name of an existing role

I would also take a page from the search_path GUC and ignore any attempt to
associate an undefined role - or at worse make it a warning.  In fact, we
already do this during the login attempt.  We should extend the forgiveness
to here as well.

DROP ROLE grouprole; -- OK
psql -U loginrole postgres
=E2=80=8BWARNING:\s\srole "group=E2=80=8Brole" does not exist
=E2=80=8BSELECT current_role; --> loginrole=E2=80=8B


In hindsight we probably could do better if we didn't treat "ROLE" like any
other configuration parameter.  I'm not sure what incremental improvements
could be made. Would a record in pg_depend that is set/cleared upon
invoking of ROLE-related commands?  Would that be sufficient?

David J.

В списке pgsql-bugs по дате отправления:

Предыдущее
От: Andrew Gierth
Дата:
Сообщение: Re: BUG #14242: Role with a setconfig "role" setting to a nonexistent role causes pg_upgrade to fail
Следующее
От: "David G. Johnston"
Дата:
Сообщение: Re: BUG #14242: Role with a setconfig "role" setting to a nonexistent role causes pg_upgrade to fail