On Mon, Mar 10, 2025 at 11:15:04AM +0530, Ashutosh Sharma wrote:
> On Fri, Mar 7, 2025 at 10:55 PM Nathan Bossart <nathandboss...@gmail.com> 
> wrote:
>> I noticed that much of this code is lifted from DropRole(), and the new
>> check_drop_role_dependency() function is only used by DropRole() right
>> before it does the exact same scans.  Couldn't we put the new dependency
>> detection in those existing scans in DropRole()?
> 
> It can be done, but mixing the code that checks for the drop role
> dependency with the code that removes entries for the role being
> dropped from pg_auth_members could reduce clarity and precision. This
> is more of a sanity check which I felt was necessary before we proceed
> with actually dropping the role, starting with the deletion of drop
> role entries from the system catalogs. I’m aware there’s some code
> duplication, but I think it should be fine.

Looking closer, we probably need to move this check to the second pass,
anyway:

        postgres=# CREATE ROLE a CREATEROLE;
        CREATE ROLE
        postgres=# SET ROLE a;
        SET
        postgres=> CREATE ROLE b CREATEROLE;
        CREATE ROLE
        postgres=> SET ROLE b;
        SET
        postgres=> CREATE ROLE c;
        CREATE ROLE
        postgres=> RESET ROLE;
        RESET
        postgres=# DROP ROLE b, c;
        ERROR:  role "b" cannot be dropped because some objects depend on it
        DETAIL:  role a inherits ADMIN privileges on role c through role b
        postgres=# DROP ROLE c, b;
        DROP ROLE

The first DROP ROLE should probably succeed, if for no other reason than
individually dropping role c followed by role b would succeed.

-- 
nathan


Reply via email to