Amazon Redshift에서 TRUNCATE를 실행했을 때, must be owner of relation 에러가 날 경우 대처법

Amazon Redshift에서 TRUNCATE 쿼리를 실행할 때 must be owner of relation 에러가 났을 경우의 대응에 대한 블로그입니다.
2023.05.23

안녕하세요 DA사업본부 송영진입니다.

오늘은 Amazon Redshift에서 TRUNCATE 쿼리를 실행할 때 must be owner of relation 테이블_이름 에러가 났을 경우의 대응에 대해 간단하게 알아보도록 하겠습니다.

TRUNCATE란?

구문

TRUNCATE [TABLE] 테이블_이름

테이블 스캔을 수행하지 않고 테이블에서 모든 행을 삭제합니다. 이 작업은 정규화되지 않은 DELETE 작업을 대신하여 더 빠르게 수행할 수 있는 수단입니다. TRUNCATE 명령을 실행하려면 테이블의 소유자 또는 슈퍼 사용자여야 합니다.

TRUNCATE는 DELETE보다 훨씬 더 효율적이며 VACUUM 및 ANALYZE가 필요하지 않습니다. 하지만 TRUNCATE는 이 명령이 실행되는 트랜잭션을 커밋합니다.

TRUNCATE는 테이블 내부의 데이터를 모두 삭제하는 명령입니다.

기본적으로 삭제할 대상을 찾은 후 삭제하는 DELETE보다 빠르게 처리됩니다.

must be owner of relation에러는 어떤 경우에 발생하는가?

위의 TRUNCATE 설명의 인용에 나와있는 부분인데요 중요한 부분을 다시 읽어보겠습니다

TRUNCATE 명령을 실행하려면 테이블의 소유자 또는 슈퍼 사용자여야 합니다. 

그렇습니다. SQL을 실행하는 유저가 테이블의 오너가 아닌 경우, 또는 유저가 슈퍼 유저가 아닌 경우에 TRUNCATE를 실행 할 경우에 이런 에러가 일어나게됩니다.

테이블의 소유자를 확인하는 법

 

SELECT tableowner FROM pg_tables WHERE tablename='테이블_이름' AND schemaname='스키마_이름';

해결법

해결법은 다음과 같습니다.

  1. 테이블을 소유하고 있는 유저로 SQL을 실행
  2. 실행을 원하는 유저에게 테이블의 소유권을 변경
  3. 실행을 원하는 유저를 슈퍼 유저로 변경

이러한 방법으로 유저를 바꾸거나 테이블의 소유자를 바꾸거나, 유저의 권한을 상승시키는 방법이 있습니다.

저는 2번째 방법으로 이 문제를 해결했는데요, 실행을 원하는 유저가 테이블의 소유권을 갖도록 테이블의 오너를 변경했습니다.

다음과 같은 SQL로 테이블의 오너를 변경 할 수 있습니다.

ALTER TABLE 테이블_이름 OWNER TO 새로운_유저;

여기서 한가지 문제

소유권을 변경하고 싶은 테이블이 한 스키마의 모든 테이블일 때 하나하나 테이블의 오너를 변경해줘야 합니다.

이러한 SQL을 하나하나 복사해서 테이블 명을 바꾸고 하기가 귀찮은 경우가 있습니다.

그럴 때 다음과 같은 SQL로 스키마 안의 모든 테이블의 소유권을 변경하는 SQL을 생성 할 수 있습니다.

SELECT 'ALTER TABLE '||t.schemaname||'.'||t.tablename ||' OWNER TO 새로운_유저;' FROM pg_tables t WHERE schemaname='스키마_이름';

마지막으로

저는 테이블을 생성하는 유저와 배치작업에서 사용하는 유저가 달라서 이러한 문제가 있었는데요, 테이블의 소유자를 변경하는 것으로 해결을 했습니다. 여러분들도 TRUNCATE를 사용할 때에는 소유자 또는 슈퍼 유저에서만 가능하다는 점을 염두해두시고 저와 같은 실수를 하지 않으시길 바랍니다. 감사합니다!