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 삭제'의 쿼리를 실행하면 된다.