RDS for PostgreSQL DB 인스턴스에서 사용자 또는 역할을 삭제할 수 없는 이유는 무엇입니까?

4분 분량
0

Amazon Relational Database Service(RDS) for PostgreSQL 인스턴스에서 사용자 또는 역할을 삭제하려고 하면 "일부 객체가 역할에 종속되어 있으므로 역할을 삭제할 수 없음(role cannot be dropped because some objects depend on it)"이라는 오류 메시지가 표시됩니다.

간략한 설명

RDS for PostgreSQL의 사용자 또는 역할이 테이블 또는 스키마와 같은 객체를 생성한 경우 사용자 또는 역할이 생성된 객체의 소유자가 됩니다. 데이터베이스에서 하나 이상의 객체를 소유하거나 이러한 객체에 대한 권한이 있는 사용자 또는 역할을 삭제하려고 하면 부여된 사용 권한(해당되는 경우)과 함께 사용자 또는 역할에 종속된 개체가 있음을 나타내는 오류가 표시됩니다.

종속 객체가 있는 사용자 또는 역할을 삭제하려면 다음을 수행해야 합니다.

  1. 해당 객체의 소유권을 다른 사용자에게 재할당합니다.
  2. 사용자 또는 역할에 부여된 모든 권한을 취소합니다.

참고: 이러한 객체가 더 이상 필요하지 않으면 해당 객체를 삭제한 다음 역할을 삭제하는 것이 좋습니다. DROP OWNED 명령을 사용하여 역할이 소유한 모든 객체를 데이터베이스에서 삭제할 수 있습니다. 또한 해당 데이터베이스의 객체 또는 공유 객체에 대해 역할에 부여된 모든 권한을 취소할 수 있습니다. DROP OWNED 명령이 성공적으로 실행되면 역할을 삭제할 수 있습니다.

해결 방법

다음 예에서는 세 가지 데이터베이스 역할이 사용됩니다.

  • test_user: 삭제해야 하는 사용자 또는 역할입니다.
  • admin_user: 필요한 사용자 또는 역할을 삭제하는 데 사용되는 역할입니다. 이 사용자는 rds_superuser 역할이 연결되어 RDS에서 권한이 가장 높은 사용자입니다.
  • another_user: test_user가 소유한 객체의 소유권이 할당된 사용자 또는 역할입니다.

다음 명령을 실행하여 로그인한 역할을 확인합니다.

pg_example=> SELECT current_user;

출력은 다음과 유사합니다.

current_user
--------------
 admin_user
(1 row)

종속 객체가 있는 사용자 또는 역할을 삭제하려고 하면 다음과 유사한 오류가 발생합니다.

pg_example=> DROP ROLE test_user;
ERROR:  role "test_user" cannot be dropped because some objects depend on it
DETAIL:  privileges for database pg_example
owner of table test_table
owner of schema test_schema
owner of sequence test_schema.test_seq
privileges for table test_t2

이 예에서 삭제되는 역할은 test_user입니다. 현재 로그인되어 있는 역할은 데이터베이스의 마스터 사용자인 admin_user입니다.

오류 메시지에서 다음 정보를 얻을 수 있습니다.

  • test_user 역할에는 pg_example 데이터베이스 및 test_t2 테이블에 대해 부여된 권한이 있습니다.
  • test_user 역할은 test_schema에서 test_table 테이블, test_schema 스키마, test_seq 시퀀스 객체를 소유합니다.

참고: 다른 데이터베이스에 연결되어 있을 때 사용자 또는 역할을 삭제하면 다음과 유사한 출력이 표시됩니다.

pg_another_db=> DROP ROLE test_user;
ERROR:  role "test_user" cannot be dropped because some objects depend on it
DETAIL:  privileges for database pg_example
4 objects in database pg_example

사용자 또는 역할이 소유한 객체를 보려면 소유한 객체가 있는 데이터베이스에 연결해야 합니다.

사용자 또는 역할을 삭제하려면 소유한 객체의 소유권을 다른 사용자 또는 역할에 재할당하고 연결된 권한을 취소해야 합니다. PostgreSQL REASSIGN OWNED 명령을 사용하여 해당 객체의 소유권을 다른 사용자에게 재할당할 수 있습니다. 이 명령을 실행할 때 다음과 유사한 오류가 발생할 수 있습니다.

pg_example=> select current_user;
 current_user
--------------
 test_user
pg_example=> REASSIGN OWNED BY test_user TO another_user;
ERROR:  permission denied to reassign objects

이 문제를 해결하려면 소유권을 재할당하는 사용자에게 사용자 또는 역할을 부여해야 합니다. test_useranother_user의 소유자가 아니기 때문에 test_user를 사용해서는 이를 수행할 수 없습니다. 따라서 다음과 유사한 오류가 표시될 수 있습니다.

pg_example=> select current_user;
 current_user
--------------
 test_user
pg_example=> grant another_user to test_user;
ERROR:  must have admin option on role "another_user"

다음 중 하나를 수행하여 소유권을 재할당하는 사용자에게 사용자 또는 역할을 부여할 수 있습니다.

  • 마스터 사용자로 로그인하고 GRANT 명령을 실행합니다.
pg_example=> select current_user;
 current_user
--------------
 admin_user
pg_example=> GRANT another_user TO test_user;
GRANT ROLE
  • 소유권을 재할당할 사용자로 로그인하고 GRANT 명령을 실행합니다.
pg_example=> select current_user;
 current_user
--------------
 another_user
pg_example=> GRANT another_user TO test_user;
GRANT ROLE

앞의 옵션 중 하나를 선택한 후, test_user로 로그인한 다음 test_user가 소유한 객체의 소유권을 another_user에게 재할당합니다.

pg_example=> select current_user;
 current_user
--------------
 test_user
pg_example=> reassign owned by test_user to another_user;
REASSIGN OWNED

마스터 사용자로 로그인하고 기존 권한이 있는 test_user를 삭제하려고 하면 다음과 유사한 오류가 발생할 수 있습니다.

pg_example=> select current_user;
 current_user
--------------
 admin_user
pg_example=> DROP ROLE test_user;
ERROR:  role "test_user" cannot be dropped because some objects depend on it
DETAIL:  privileges for database pg_example
privileges for table test_t2

이 경우 REASSIGN 명령이 성공했는데도 오류가 발생합니다. 이는 test_user의 권한을 취소해야 하기 때문입니다. REVOKE 명령을 실행하여 test_user가 권한을 가진 객체에서 모든 사용 권한을 취소합니다. 이 예에서는 test_userpg_example 데이터베이스 및 test_t2 테이블에 대한 권한을 취소합니다.

pg_example=> REVOKE ALL ON TABLE test_t2 FROM test_user;
REVOKE
pg_example=> REVOKE ALL ON DATABASE pg_example FROM test_user;
REVOKE

그런 다음 test_user 사용자를 삭제합니다.

pg_example=> DROP ROLE test_user;
DROP ROLE

권한을 취소한 후 역할을 삭제할 수 있습니다.


관련 정보

PostgreSQL 설명서의 DROP ROLE