Watch at Ease세상을 읽고, 일상의 답을 찾다.

기술 · 실용 가이드

PostgreSQL relation does not exist? search_path 변경 전에 실패 세션을 지문화하세요

SQLSTATE 42P01은 앱과 관리 셸이 다른 DB·schema·session에서 이름을 해석할 때 발생할 수 있습니다. 실패 연결에서 읽기 전용 검사를 실행한 뒤 증명된 분기만 수정하세요.

PostgreSQL relation does not exist? search_path 변경 전에 실패 세션을 지문화하세요
원본 일러스트: 같은 pool, transaction, role에서 database, server address/port, user, role, search_path와 current_schemas(true)를 기록합니다. Watch at Ease

pgAdmin이나 psql에서 테이블이 보여도 앱은 relation does not exist를 낼 수 있습니다. 실패 세션이 실제로 쓴 서버, DB, 역할, 검색 경로와 식별자를 확인해야 합니다.

테이블 재생성, 전역 search_path 변경, 광범위한 권한 부여부터 하지 마세요. 원래 연결에서 오류와 SQLSTATE를 보존하고 읽기 전용 지문을 수집하세요.

정확한 실패 세션 캡처

같은 pool, transaction, role에서 database, server address/port, user, role, search_path와 current_schemas(true)를 기록합니다.

relation 토큰, 따옴표, schema와 SQLSTATE를 그대로 보존하고 관리 셸도 같은 지문을 수집합니다.

상태 변경 없이 이름 해석

비한정 이름과 schema 한정 이름을 각각 to_regclass로 확인하고 pg_class와 pg_namespace에서 종류, 지속성, 가시성을 기록합니다.

둘 다 NULL이고 catalog에도 없으면 잘못된 DB, 미적용·rollback migration, 삭제 또는 다른 세션의 temp를 조사합니다.

case·visibility·privilege 분리

catalog 철자와 SQL을 비교합니다. "Orders"는 정확히 따옴표로 불러야 합니다.

한정 이름이 있지만 접근 실패하면 schema USAGE, table privilege, API 노출 규칙을 따로 확인합니다.

migration 또는 admin 세션 비교

실제 생성한 migration tool이나 transaction에서 같은 지문을 실행하고 endpoint, DB, role, schema를 비교합니다.

commit되지 않은 CREATE, 실패 migration, 다른 tenant, temp table은 search_path 변경으로 고칠 수 없습니다.

좁은 수정 후 검증

안정적인 단일 객체는 schema 한정 이름을 사용합니다. 비한정 조회가 의도라면 role 또는 연결 초기화를 검토하고 pool을 재연결합니다.

rename과 grant는 조정된 최소 변경으로 수행하고 대상 확인 전 같은 이름의 테이블을 만들지 않습니다. 새 앱 연결에서 원래 문장을 다시 실행합니다.

PostgreSQL relation does not exist? search_path 변경 전에 실패 세션을 지문화하세요
원본 일러스트: rename과 grant는 조정된 최소 변경으로 수행하고 대상 확인 전 같은 이름의 테이블을 만들지 않습니다. 새 앱 연결에서 원래 문장을 다시 실행합니다. Watch at Ease