Amazon Redshift 데이터베이스에서 사용자를 삭제했지만 여전히 pg_class 테이블에 해당 사용자가 표시됩니다.

최종 업데이트 날짜: 2020년 1월 9일

삭제된 Amazon Redshift 사용자가 pg_user 테이블에는 표시되지 않지만 pg_class 테이블에는 여전히 표시되는 이유는 무엇입니까?

간략한 설명

삭제된 사용자가 클러스터의 다른 데이터베이스에 있는 객체를 소유하고 있는 경우 삭제된 사용자가 여전히 pg_class 테이블에 표시될 수 있습니다. DROP USER 명령은 삭제 예정인 사용자가 소유한 객체를 현재 데이터베이스에서만 확인합니다. 사용자가 다른 데이터베이스의 객체를 소유한 경우, 오류가 발생하지 않습니다. 대신 삭제된 사용자는 객체의 소유권을 유지하며 usesysid는 여전히 pg_class 테이블에 표시됩니다.

해결 방법

클러스터의 각 데이터베이스에서 다음 명령을 실행합니다. 이 명령은 삭제된 사용자가 소유한 객체를 확인합니다.

select distinct schemaname, tablename, tableowner from pg_tables where tableowner like '%unknown%';

삭제된 사용자가 여전히 데이터베이스에서 객체를 소유하는 경우 다음과 비슷한 출력이 표시됩니다. usenames가 저장된 pg_user 테이블에서 소유자가 삭제되었기 때문에 tableowner는 "unknown"입니다.

demo_localdb=# select distinct schemaname, tablename, tableowner from pg_tables where tableowner like '%unknown%'; 
 schemaname |    tablename    |    tableowner     
------------+-----------------+-------------------
 demo_local | orders_nocomp_2 | unknown (UID=114)
 demo_local | orders_nocomp_3 | unknown (UID=115)
(2 rows)

ALTER TABLE 명령을 사용하여 객체의 소유권을 이전합니다. 다음 예제에서 새 소유자는 userc입니다.

alter table demo_local.orders_nocomp_2 owner to userc;

예방 조치

사용자를 삭제하기 전에 다음 쿼리를 실행하여 사용자가 소유한 객체를 찾습니다. (v_find_dropuser_objs 보기를 사용하여 이 작업을 수행할 수도 있습니다.) 다음 예제에서 사용자는 labuser입니다.

SELECT decode(pgc.relkind,
             'r','Table',
             'v','View'
       ) ,
       pgu.usename,
       pgu.usesysid,
       nc.nspname,
       pgc.relname,
       'alter table ' || QUOTE_IDENT(nc.nspname) || '.' || QUOTE_IDENT(pgc.relname) || ' owner to '
FROM pg_class pgc,
     pg_user pgu,
     pg_namespace nc
WHERE pgc.relnamespace = nc.oid
AND   pgc.relkind IN ('r','v')
AND   pgu.usesysid = pgc.relowner
AND nc.nspname NOT ILIKE 'pg\_temp\_%'
AND pgu.usename = 'labuser'

이 쿼리는 다음과 유사한 명령을 사용하여 생성된 스키마를 소유한 사용자를 찾지 못할 수 있습니다. 이 예제에서 labuser는 스키마 소유자입니다.

create schema demo_local authorization labuser;

스키마 수준 권한이 있는 사용자는 스키마가 새 소유자에게 이전되지 않는 한 삭제할 수 없습니다. 다음은 userc에게 소유권을 이전하는 방법의 예입니다.

alter table demo_local.orders_nocomp_2 owner to userc;