bibimbap/db/migrations/20261014-game-display-metad...

48 lines
1.8 KiB
PL/PgSQL

-- 게임별 WebGL 기준 화면 크기. 앱 배포 전에 대상 스키마에 적용한다.
-- search_path는 실행자가 대상(dev/live/격리 테스트) 스키마로 명시한다.
-- 앱 자동 적용 없음. 기존 행 변경/백필 없음. 재실행 가능.
-- 롤백: 이전 앱 버전으로 복귀해도 nullable 컬럼은 유지 가능하다.
-- 컬럼/제약 삭제는 별도 승인 후 수행한다.
BEGIN;
ALTER TABLE "games"
ADD COLUMN IF NOT EXISTS "display_width" integer,
ADD COLUMN IF NOT EXISTS "display_height" integer,
ADD COLUMN IF NOT EXISTS "display_source" character varying(16);
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM pg_constraint
WHERE conrelid = 'games'::regclass
AND conname = 'games_display_dimensions_check'
) THEN
ALTER TABLE "games"
ADD CONSTRAINT "games_display_dimensions_check" CHECK (
("display_width" IS NULL AND "display_height" IS NULL)
OR (
"display_width" IS NOT NULL AND "display_height" IS NOT NULL
AND "display_width" BETWEEN 1 AND 16384
AND "display_height" BETWEEN 1 AND 16384
AND "display_width"::bigint <= "display_height"::bigint * 32
AND "display_height"::bigint <= "display_width"::bigint * 32
)
);
END IF;
IF NOT EXISTS (
SELECT 1 FROM pg_constraint
WHERE conrelid = 'games'::regclass
AND conname = 'games_display_source_check'
) THEN
ALTER TABLE "games"
ADD CONSTRAINT "games_display_source_check" CHECK (
"display_source" IS NULL
OR "display_source" IN ('build-info', 'css', 'canvas', 'manual', 'unknown')
);
END IF;
END
$$;
COMMIT;