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

4분 분량
0

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

간략한 설명

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

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

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

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

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

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

해결 방법

스크립트를 설치하여 뷰 생성

AWS 랩 GitHub 리포지토리에서 v_generate_user_grant_revoke_ddl.sqlv_find_dropuser_objs.sql 스크립트를 다운로드하여 설치합니다. v_generate_user_grant_revoke_ddl.sql 및 ㅌv_find_dropuser_objects.sql 스크립트의 뷰는 정의에서 admin 스키마를 사용합니다. Amazon Redshift 클러스터에 admin 스키마가 없는 경우 기존 스키마에서 정의를 수정하세요. 또는 admin 스키마를 생성하세요.

보기 정의에 열 변경 사항이 있는 경우, 새 보기 및 정의를 만들기 전에 보기를 삭제합니다. 이전 뷰를 삭제하기 전에 새 뷰를 만드려 하면 유효하지 않은 테이블 오류가 발생합니다.

사용자 삭제

다음 단계를 완료합니다.

  1. 사용자별로 검색하여 부여된 사용자 중 삭제하려는 모든 권한을 찾을 수 있습니다. 그런 다음, 해당 권한을 다른 사용자로 다시 부여합니다. 이 사용자는 superuser인 것이 가장 좋습니다.

    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로 권한을 재부여할 수 있습니다.

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

    select ddl from v_generate_user_grant_revoke_ddl where ddltype='revoke' and (grantee='<username>' or grantor='<username>') order by objseq, grantseq desc;

    참고: grantor를 권한을 부여한 사용자의 이름으로 대체합니다. grantee를 권한을 받는 사용자의 이름으로 대체합니다.
    쿼리에서 레코드가 반환되지 않거나 DROP USER 명령이 실패하면 다음의 쿼리를 실행합니다.

    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;

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

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

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

    사용자 이름과 사용자 ID를 검색하려면, PG_USER_INFO 테이블에서 usenameusesysid 열 항목을 찾습니다.
    참고: PG_DEFAULT_ACL 테이블에 사용자 항목이 있는 경우, 사용자를 삭제할 수 없습니다.

  4. 사용자에게 여전히 일부 개체에 대한 권한이 있는 경우, 사용자에게 assumerole 권한이 있는지 확인합니다.

    select pg_get_iam_role_by_user('<user-name>');

    사용자에게 assumerole 권한이 있는 경우 먼저 전체 사용자로부터 assumerole을 취소해야 합니다. 그리고 나서 다음 명령을 실행하여 사용자명을 취소합니다.

    revoke assumerole on all from public for all;
    revoke assumerole on all from <user-name> for all;
  5. (선택 사항) 사용자에게 여전히 일부 개체에 대한 권한이 있는 경우, 사용자가 다른 그룹에 속해 있는지 확인합니다. 사용자에게 해당 그룹에서 부여된 권한이 있을 수 있습니다. 또는 사용자에게 PUBLIC 그룹에 부여된 권한이 있을 수 있습니다.
    사용자에게 여전히 부여된 권한을 확인하려면, 다음 쿼리를 실행합니다.

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

    pg\ _group 쿼리의 출력에서 grolist 열에 사용자를 나열하는 항목이 있는지 확인합니다. 사용자가 다른 그룹에 속해 있으면, 해당 사용자 ID가 나열됩니다. 해당 그룹에 부여된 권한을 확인합니다.

    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 <username-to-be-dropped>;

그룹 삭제

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

다음 단계를 완료합니다.

  1. 그룹에 부여된 모든 권한을 찾은 다음, 해당 권한을 취소합니다.

    select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and grantee= 'group <group-name>';
  2. Amazon Redshift 클러스터의 각 데이터베이스에서 2단계를 반복합니다. 모든 데이터베이스에서 그룹의 권한이 해지되었는지 확인합니다.

  3. 사용자 그룹을 제거하려면 DROP GROUP 명령을 실행합니다.

AWS 공식
AWS 공식업데이트됨 9달 전