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

최종 업데이트 날짜: 2021년 11월 12일

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

간략한 설명

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

ERROR: user "username" cannot be dropped because some objects depend on it
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.    AWS 랩 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 스키마가 없는 경우 다른 기존 스키마에서 이 뷰를 생성할 수 있습니다. 다른 스키마에서 이 뷰를 생성하려면 정의를 수정하거나 관리자 스키마를 생성합니다. 뷰 정의에 열이 변경된 경우 새로운 뷰 및 정의를 생성하기 전에 뷰를 삭제해야 합니다. 뷰가 이미 존재하고 이전 뷰를 삭제하지 않고 새로운 뷰를 생성하려고 하면 잘못된 테이블 정의 오류가 발생합니다.

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

select ddl, grantor, grantee from admin.v_generate_user_grant_revoke_ddl where grantee='<username-to-be-dropped>' and ddltype='grant' and objtype <>'default acl' order by objseq,grantseq;

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

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

select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and grantee='<username-to-be-dropped>' order by objseq, grantseq desc;

참고: "grantor" 및 "grantee"를 각각 권한을 부여하고 받을 수 있는 사용자 이름으로 바꿔야 합니다.

쿼리에서 레코드를 반환하지 않거나 사용자 삭제 명령이 실패하면 다음 쿼리를 실행합니다.

select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and ddl ilike '%<user-to-be-dropped>%' order by objseq, grantseq desc;

이 쿼리는 사용자를 삭제하기 전에 사용자로부터 취소해야 하는 권한을 나열합니다. 다음 단계로 진행하기 전에 이러한 권한을 취소해야 합니다.

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

select * from pg_user where usename = '<username-to-be-dropped>'; 
select * from pg_default_acl where defacluser= <user-id>;

사용자 이름 및 사용자 ID를 검색하려면 PG_USER 테이블에서 usenameusesysid 열 항목을 찾습니다.

참고: PG_DEFAULT_ACL 테이블에 사용자 항목이 없을 경우 사용자를 삭제할 수 없습니다.

5.    (선택 사항) 삭제할 사용자에게 아직 일부 객체에 대한 사용 권한이 있는 경우, 사용자가 다른 그룹의 일부인지 확인합니다. 사용자에게 해당 그룹에서 부여된 권한이 있을 수 있습니다. 또는 사용자에게 PUBLIC 그룹(또는 모든 사용자)에게 부여된 권한이 있을 수 있습니다.

사용자에게 여전히 부여된 권한을 확인하려면 다음 쿼리를 실행합니다.

select * from pg_user where usename = '<username-to-be-dropped>';
select * from pg_group;

두 번째 쿼리의 출력에서 grolist 열을 확인하고 삭제할 사용자를 나열한 항목이 있는지 확인합니다. 삭제할 사용자가 다른 그룹에 속하면 사용자 ID가 나열됩니다.

grolist 열이 사용자가 그룹의 일부임을 나타내는 경우, 해당 그룹에 부여된 권한을 확인합니다.

select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and grantee= 'group <group-name>' ;
select * from admin.v_generate_user_grant_revoke_ddl where objname='timecards' and schemaname='postgres' and grantee='PUBLIC' and ddltype='revoke';

objnameschemaname을 각각의 테이블 및 스키마로 바꿉니다.

참고: 기본적으로 PUBLIC 그룹에 부여된 사용 권한은 모든 사용자에게 부여됩니다.

6.    사용자가 소유한 모든 객체를 찾은 다음, 삭제하는 사용자의 소유권을 다른 사용자 또는 관리자에게 이전합니다.

select ddl||'<newuser>;' as ddl from admin.v_find_dropuser_objs where objowner = '<username-to-be-dropped>';

이 출력에는 소유권을 새 사용자에게 이전하는 데 사용할 수 있는 명령이 나열됩니다. 나열된 명령을 실행해야 합니다.

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

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

drop user <username-to-be-dropped>;

그룹 삭제

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

1.    AWS 랩 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 grantee= 'group <group-name>';

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

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


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요하세요?