안녕하세요 현재 A라는 테이블을 사용하고 해당 테이블은 MONTH를 기준으로 파티션 테이블을 구성하고 있는 상황입니다.
A라는 테이블에 데이터를 insert하기 전에 트리거를 통해서 함수를 호출하고 MONTH릍 이용해 만들어진 파티션이 있는지 확인하고 없으면 파티션을 우선 생성해준 뒤
데이터를 insert하는 방식으로 파티션 테이블을 자동생성하여 관리하도록 하려합니다.
트리거는
create trigger create_partition_trigger before
insert
on
Bschema.Atable for each row execute function Bschema.create_partition_if_not_exists()
와 같고
함수는
CREATE OR REPLACE FUNCTION Bschema.create_partition_if_not_exists()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
DECLARE
month text;
partition_name text;
BEGIN
month := NEW.month;
-- month를 기준으로 파티션 이름을 생성합니다.
partition_name := 'Atable_' || month;
-- 생성된 파티션 테이블이 존재하지 않으면 파티션을 추가합니다.
IF NOT EXISTS (
SELECT 1 FROM pg_catalog.pg_class WHERE relname = partition_name
) THEN
-- 필요한 파티션을 추가하기 위한 SQL 쿼리를 생성합니다.
raise notice 'PASSED!!';
EXECUTE format('CREATE TABLE IF NOT EXISTS %I PARTITION OF Bschema.Atable FOR VALUES IN (%I)', partition_name, month);
EXECUTE format('CREATE INDEX %I || ''_month_idx'' ON %I USING btree(%I)',partition_name,month);
END IF;
RETURN NEW;
END;
$function$
;
와 같습니다.
그러나 해당 트리거와 함수를 적용 후 데이터 insert시 파티션테이블 없는 데이터의 경우
SQL Error [23514]: ERROR: no partition of relation "Atable" found for row
Detail: Partition key of the failing row contains (month) = (202512).
Error position:
처럼 에러를 반환하며 파티션 테이블 생성하지 못하는데요. DB 고수님들의 도움요청드려요.
|