삭제된 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;
관련 정보
Amazon Redshift에서 "user cannot be dropped" 오류가 발생할 경우 어떻게 해결해야 합니까?
카탈로그 테이블에 대한 쿼리
데이터베이스 사용자 보기