On 13.09.2024 00:11, Robert Haas wrote:
The prohibition against circular grants is really annoying in your use
case. If dd_owner creates dd_user, then dd_user is granted to
dd_owner, which means that dd_owner cannot be granted (directly or
indirectly) to dd_user.
In search of workaround...
So, now in v16 we need a third role to made this grants.
There is a not very nice way to use the third role implicitly,
through security definer stored routines.
-- run by superuser
create role dd_owner createrole;
CREATE ROLE
create role dd_admin noinherit;
CREATE ROLE
grant dd_owner to dd_admin;
GRANT ROLE
create procedure create_role (role text, member regrole)
language plpgsql security definer as $$
begin execute (format('create role %I in role %I', role, member));
end;
$$;
CREATE PROCEDURE
revoke execute on procedure create_role from public;
REVOKE
grant execute on procedure create_role to dd_owner;
GRANT
set role dd_owner;
SET
call create_role('dd_user', 'dd_admin');
CALL
\du dd* List of roles Role name | Attributes
-----------+------------------------------ dd_admin | No inheritance, Cannot login dd_owner | Create role, Cannot login dd_user | Cannot login
\drg List of role grants Role name | Member of | Options | Grantor
-----------+-----------+--------------+---------- dd_admin | dd_owner | SET | postgres dd_user | dd_admin | INHERIT, SET | postgres
(2 rows)
I do not know how applicable this is for Dominique. Perhaps a better solution
is to review and make changes to roles&grants system by explicitly
introducing and using a third role.
--
Pavel Luzanov
Postgres Professional: https://postgrespro.com