Database/PostgreSQL

[PostgreSQL] role "rolename" cannot be dropped because some objects depend on it

Ma_Sand 2024. 10. 12. 18:37
반응형

psql 접속 후 \du 입력 시 users의 역할이 출력된다.

사용하지 않는 것을 정리하고자 역할을 삭제하려 했다. 그런데 에러가 발생하였다. 

username1의 role을 삭제할 때 발생한 'some objects depend on it'라는 에러는 해당 role이 특정 객체(ex. 데이터베이스)에 대한 권한을 가지고 있을 때 발생한다.

이러한 경우에는 다음과 같이 해결하면 된다.

 

1. 데이터베이스 접속

'drop role username1'을 입력했을 때 발생한 에러에서 데이터베이스 username2의 권한이라는 세부사항(DETAIL: privileges for database username2)이 있었다. 그 말인즉슨, username2가 username1의 role을 제어할 수 있다는 것이다. 그러므로 username1의 role을 삭제하기 위해선 username2로 데이터베이스 접속을 해야 한다.

\c username2

 

2. 권한 제거

username1 role이 소유한 권한을 제거한다. REVOKE 쿼리를 입력한 후 REVOKE라고 출력되면 정상적으로 권한이 제거된 것이다.

REVOKE ALL PRIVILEGES ON DATABASE username2 FROM username1;

 

3. Role 삭제

username1 role을 삭제한다.

DROP ROLE username1;

이때, 해당 role이 객체를 소유하고 있으면 다음과 같이 에러가 발생하면서 role이 삭제되지 않는다.

이 경우에는 해당 객체(view, table, sequence, etc...)의 소유자를 변경한 후 role을 삭제하면 된다.

 

cf. 객체의 소유자 변경

username1 대신에 객체를 소유할 user를 만들어서 해당 user에게 소유권을 넘긴다.

ALTER TABLE tablename1 OWNER TO new_owner;
ALTER VIEW viewname1 OWNER TO new_owner;

 

나머지 객체들도 위처럼 동일하게 변경한 후 다시 '3. Role 삭제'의 쿼리를 실행하면 된다.

 

반응형