Amazon Redshift에서 "사용자를 삭제할 수 없음(user cannot be dropped)" 오류가 발생할 경우 어떻게 해결해야 합니까?

최종 업데이트 날짜: 2020년 10월 16일

Amazon Redshift에서 사용자 또는 그룹을 삭제할 수 없습니다. 문제를 해결하려면 어떻게 해야 합니까?

간략한 설명

Amazon Redshift에서 사용자 또는 그룹을 삭제하려고 하면 다음 오류 메시지 중 하나가 발생할 수 있습니다.

ERROR: user 'username' cannot be dropped because the user has a privilege on some object
ERROR: user 'username' cannot be dropped because the user owns some object

이 오류 메시지를 해결하려면 먼저 사용자 권한을 제거한 다음, 객체 소유권을 이전하거나 객체의 그룹 소유권을 제거해야 합니다.

참고: Amazon Redshift 클러스터의 모든 데이터베이스에서 사용자 및 그룹 권한을 취소해야 합니다.

해결 방법

사용자 삭제

중요: 사용자를 삭제하기 전에 사용자 권한을 취소합니다. 그런 다음 사용자가 소유한 모든 데이터베이스 객체의 소유권을 이전합니다.

1.    AWSLabs GitHub 리포지토리에서 v_generate_user_grant_revoke_ddl.sql 스크립트를 다운로드하여 설치합니다. v_generate_user_grant_revoke_ddl.sql 스크립트는 다음 두 단계에 유용한 보기를 Amazon Redshift에 생성합니다.

참고: v_generate_user_grant_revoke_ddl.sqlv_find_dropuser_objs.sql 스크립트에 대한 뷰는 해당 정의에서 admin 스키마를 사용합니다. Amazon Redshift 클러스터에서 생성된 admin 스키마가 없으면 다른 기존 스키마에서 이 뷰를 생성할 수 있습니다. 다른 스키마에서 이 뷰를 생성하려면 정의를 수정하거나 admin 스키마를 생성합니다.

2.    부여된 사용자 권한 중 삭제할 권한을 모두 찾은 다음, 다른 사용자에게 해당 권한을 다시 부여합니다.

select regexp_replace(ddl,grantor,'aws') from admin.v_generate_user_grant_revoke_ddl where grantor='aws' and ddltype='grant' and objtype <>'default acl' order by objseq,grantseq;

참고: 권한을 다시 부여하는 사용자는 객체에 대한 권한이 있는 사용자여야 합니다. 이 사용자는 다른 사용자에게 권한을 부여할 수도 있어야 합니다. 재부여 권한을 가진 다른 사용자가 없으면 수퍼유저로서 이러한 권한을 다시 부여할 수 있습니다.

3.    사용자에게 부여된 모든 권한을 찾은 다음, 해당 권한을 취소합니다.

select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and (grantee='testuser1' or grantor='aws') order by objseq, grantseq desc;

4.    다음 쿼리를 실행하여 빈 ACL(액세스 제어 목록)이 있는지 확인합니다.

select * from pg_user where usename = ‘testuser1’;
select * from pg_default_acl where defacluser= 108;

사용자를 삭제하려면 pg_default_acl 테이블에 사용자 항목이 있어서는 안 됩니다.

쿼리가 사용자에 대한 항목을 반환하는 경우 revoke 명령을 다시 실행합니다.

select ddl from v_generate_user_grant_revoke_ddl where ddltype='revoke' and (grantee=’testuser1’ or grantor='aws') order by objseq, grantseq desc;

5.    사용자가 소유한 모든 객체를 찾은 다음, 삭제하는 사용자의 소유권을 다른 사용자 또는 관리자에게 이전합니다. 다음 예에서 username은 현재 소유자이고 newuser는 새 소유자입니다.

select ddl||'<newuser>;' as ddl from v_find_dropuser_objs where objowner = 'testuser1';

6.    Amazon Redshift 클러스터의 각 데이터베이스에서 2~5단계를 반복합니다.

7.    DROP USER 명령을 사용하여 데이터베이스에서 사용자를 제거합니다.

drop user testuser1;

그룹 삭제

그룹을 삭제하기 전에 객체에 대한 해당 그룹의 모든 권한을 취소해야 합니다.

1.    AWSLabs GitHub 리포지토리에서 v_generate_user_grant_revoke_ddl.sqlv_find_dropuser_objs.sql 스크립트를 다운로드하여 설치합니다. 이러한 스크립트는 다음 단계에 유용한 보기를 Amazon Redshift에 생성합니다.

참고: v_generate_user_grant_revoke_ddl.sqlv_find_dropuser_objs.sql 스크립트에 대한 뷰는 해당 정의에서 admin 스키마를 사용합니다. Amazon Redshift 클러스터에서 생성된 admin 스키마가 없으면 다른 기존 스키마에서 이 뷰를 생성할 수 있습니다. 다른 스키마에서 이 뷰를 생성하려면 정의를 수정하거나 admin 스키마를 생성합니다.

2.    아래의 예제와 같이 그룹에 부여된 모든 권한을 찾은 다음, 해당 권한을 취소합니다.

select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and username='<groupname>' order by sequence;

3.    Amazon Redshift 클러스어의 각 데이터베이스에서 2단계를 반복해서 모든 데이터베이스에서 그룹 권한이 취소되었는지 확인합니다.

4.    DROP GROUP 명령을 사용하여 사용자 그룹을 제거합니다.


이 문서가 도움이 되었습니까?


결제 또는 기술 지원이 필요합니까?