Amazon Redshift에서 “사용자를 삭제할 수 없습니다” 오류를 해결하려면 어떻게 해야 하나요?

5분 분량
0

Amazon Redshift에서 사용자 또는 그룹을 삭제할 수 없습니다.

간략한 설명

Amazon Redshift에서 사용자를 삭제하려고 할 때, 다음 오류 메시지 중 하나가 표시될 수 있습니다:

  • 오류: 일부 개체가 종속되어 있기 때문에 “사용자 이름”을 삭제할 수 없습니다.
  • 오류: 사용자에게 일부 개체에 대한 권한이 있기 때문에 “사용자 이름”을 삭제할 수 없습니다.
  • 오류: 사용자가 일부 개체를 소유하고 있기 때문에 "사용자 이름"을 삭제할 수 없습니다.

이러한 유형의 사용자를 삭제하려고 할 때 이러한 오류가 발생할 수 있습니다:

  • 이전에 부여된 기본 권한의 소유자 또는 대상 사용자.
  • 모든 개체(예: 데이터베이스, 스키마, 테이블, 뷰, 프로시저 및 라이브러리)의 소유자.
  • 앞서 언급한 개체에 대한 권한이 있는 사용자.

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

중요: 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_objects.sql 스크립트의 뷰는 정의에서 admin 스키마를 사용합니다. Amazon Redshift 클러스터에 admin 스키마가 생성되어 있지 않은 경우, 다른 기존 스키마에서 이러한 보기를 생성합니다. 다른 스키마에서 이러한 보기를 만들려면, 정의를 수정하거나 관리자 스키마를 생성합니다. 보기 정의에 열 변경 사항이 있는 경우, 새 보기 및 정의를 만들기 전에 보기를 삭제합니다. 보기가 이미 존재하는데 이전 보기를 삭제하기 전에 새 보기를 만들려고 하면, "테이블이 유효하지 않음" 오류가 발생합니다.

  1. 삭제해야 하는 사용자별로 부여된 모든 사용자 권한을 찾습니다. 그런 다음, 해당 권한을 다른 사용자로 다시 부여합니다. 이 사용자는 슈퍼유저인 것이 가장 좋습니다.
select regexp_replace(ddl,grantor,'<superuser>') from v_generate_user_grant_revoke_ddl where grantor='<username>' and ddltype='grant' and objtype <>'default acl' order by objseq,grantseq;

참고: 권한을 다시 부여하는 사용자는 개체에 대한 권한이 있는 사용자여야 합니다. 이 사용자는 다른 사용자에게 권한 부여가 가능해야 합니다. 권한 재부여 권한을 가진 다른 사용자가 없는 경우, superuser로 권한을 재부여할 수 있습니다.

  1. 사용자에게 부여된 모든 권한을 찾은 다음, 해당 권한을 취소합니다:
select ddl from v_generate_user_grant_revoke_ddl where ddltype='revoke' and (grantee='<username>' or grantor='<username>') order by objseq, grantseq desc;

참고: grantorgrantee를 각각 권한을 부여하고 받을 수 있는 사용자 이름으로 바꿉니다.

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

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;

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

  1. 이 쿼리를 실행하여 비어 있는 액세스 제어 목록(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 테이블에 사용자 항목이 있는 경우, 사용자를 삭제할 수 없습니다.

  1. 사용자에게 여전히 일부 개체에 대한 권한이 있는 경우, 사용자에게 역할 위임 권한이 부여되었는지 확인합니다. 이를 확인하려면 다음 쿼리를 실행합니다:
select pg\_get\_iam\_role\_by\_user('<user-name>');

삭제할 사용자에 대한 assumerole 권한이 표시되면 이 명령으로 해당 권한을 취소합니다:

revoke assumerole on all from <user-name> for all;
  1. (선택 사항) 삭제할 사용자에게 여전히 일부 개체에 대한 권한이 있는 경우, 사용자가 다른 그룹에 속해 있는지 확인합니다. 사용자에게 해당 그룹에서 부여된 권한이 있을 수 있습니다. 또는 사용자에게 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 그룹에 부여된 권한은 모든 사용자에게 부여됩니다.

  1. 사용자가 소유한 모든 객체를 찾은 다음, 삭제하려는 사용자로부터 다른 사용자 또는 관리자에게 소유권을 이전합니다:
select ddl||'<newuser>;' as ddl from admin.v_find_dropuser_objs where objowner = '<username-to-be-dropped>';

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

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

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

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

그룹 삭제

참고: 그룹을 삭제하기 전에 해당 그룹이 개체에 대해 가지고 있는 모든 권한을 취소해야 합니다.

  1. AWS 랩 GitHub 리포지토리에서 [v\_generate\_user\_grant\_revoke\_ddl.sql](https://github.com/awslabs/amazon-redshift-utils/blob/master/src/AdminViews/v_generate_user_grant_revoke_ddl.sql) 및 [v\_find\_dropuser\_objs.sql](https://github.com/awslabs/amazon-redshift-utils/blob/master/src/AdminViews/v_find_dropuser_objs.sql) 스크립트를 다운로드하여 설치합니다. 이러한 스크립트는 다음 단계에 유용한 Amazon Redshift에서 보기를 생성합니다.
    

참고: v_generate_user_grant_revoke_ddl.sqlv_find_dropuser_objects.sql 스크립트의 뷰는 정의에서 admin 스키마를 사용합니다. Amazon Redshift 클러스터에 admin 스키마가 생성되어 있지 않은 경우, 다른 기존 스키마에서 이러한 보기를 만들 수 있습니다. 다른 스키마에서 이러한 보기를 만들려면, 정의를 수정하거나 관리자 스키마를 생성합니다.

  1. 이 예와 같이 그룹에 부여된 모든 권한을 찾은 다음, 취소합니다:
select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and grantee= 'group <group-name>';
  1. Amazon Redshift 클러스터의 각 데이터베이스에서 2단계를 반복합니다. 모든 데이터베이스에서 그룹의 권한이 해지되었는지 확인합니다.

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

관련 정보

DROP USER 사용 참고 사항

DROP GROUP 예제

AWS 공식
AWS 공식업데이트됨 7달 전
댓글 없음

관련 콘텐츠