Amazon Redshift 클러스터에서 객체를 삭제할 수 없는 이유는 무엇입니까?

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

Amazon Redshift 클러스터에서 테이블이나 뷰를 삭제할 수 없습니다. 이유가 무엇입니까?

간략한 설명

다음과 같은 이유로 Amazon Redshift 클러스터에서 객체(예: 테이블 또는 뷰)를 삭제하지 못할 수 있습니다.

  • 사용 권한 부족: 사용자에게 객체를 삭제할 수 있는 적절한 권한이 없습니다. (사용자는 객체의 소유자이거나 관리자 권한이 있어야 합니다.)
  • 객체 종속성: 테이블 열이 다른 뷰 또는 테이블에 의해 참조됩니다.
  • 잠금 경합: 트랜잭션이 객체에 대한 잠금을 유지하고 있으므로 삭제 작업이 중단됩니다.

​해결 방법

사용 권한 부족

Amazon Redshift에서는 테이블 소유자, 스키마 소유자 또는 수퍼유저만 테이블을 삭제할 수 있습니다.

사용자 권한 및 소유권을 확인하려면 v_get_obj_priv_by_user.sql script를 사용하여 뷰를 만듭니다.

CREATE OR REPLACE VIEW admin.v_get_obj_priv_by_user
AS
SELECT

객체 종속성

삭제 작업이 실패하고 다음 오류 메시지가 표시될 수 있습니다.

Invalid operation: cannot drop table/view <object_name> because other objects depend on it

잘못된 작업(Invalid operation) 오류는 대상 객체에 대한 객체 종속성을 나타냅니다.

대상 테이블에 종속된 객체를 식별하려면 다음 세 가지 뷰를 생성합니다.

이러한 세 가지 뷰를 만든 후 v_object_dependency.sql 스크립트를 사용하여 대상 객체의 종속 객체를 가져옵니다.

select * from admin.v_object_dependency where src_objectname=<target object>

모든 종속 객체를 확인한 후 CASCADE 파라미터를 사용하여 대상 객체와 함께 관련된 모든 객체를 삭제합니다.

drop table <target object> cascade;

잠금 경합

삭제를 수행할 때 삭제 명령이 중단되거나 출력되지 않으면 트랜잭션이 객체에 대한 잠금을 유지하고 있는 것일 수 있습니다. 따라서 테이블에서 AccessExclusiveLock을 얻을 수 없습니다. 객체를 삭제하려면 AccessExclusiveLock이 필요합니다.

잠금을 식별하려면 다음 구문을 사용합니다.

select a.txn_owner, a.txn_db, a.xid, a.pid, a.txn_start, a.lock_mode, a.relation as table_id,nvl(trim(c."name"),d.relname) as tablename, a.granted,b.pid as blocking_pid ,datediff(s,a.txn_start,getdate())/86400||' days '||datediff(s,a.txn_start,getdate())%86400/3600||' hrs '||datediff(s,a.txn_start,getdate())%3600/60||' mins '||datediff(s,a.txn_start,getdate())%60||' secs' as txn_duration
from svv_transactions a 
left join (select pid,relation,granted from pg_locks group by 1,2,3) b 
on a.relation=b.relation and a.granted='f' and b.granted='t' 
left join (select * from stv_tbl_perm where slice=0) c 
on a.relation=c.id 
left join pg_class d on a.relation=d.oid
where  a.relation is not null;
And once you identify the locking transaction either COMMIT the blocking transaction or terminate the session of the blocking transaction if it is no longer necessary by :
select pg_terminate_backend(PID);

잠금을 식별한 후 PG_TERMINATE_BACKEND를 사용하여 잠금을 해제합니다. Amazon Redshift에서 잠금 감지 및 해제에 대한 자세한 내용은 Amazon Redshift에서 잠금을 감지하고 해제하려면 어떻게 해야 합니까?를 참조하십시오.


이 문서가 도움이 되었습니까?


결제 또는 기술 지원이 필요합니까?