Skip to content

Holiday 編輯修復與 dim_date 優化

問題描述

錯誤訊息: column "holiday_names" of relation "dim_date" does not exist影響範圍: Holiday 編輯、新增、刪除功能完全失效 根本原因: 20250811200000_support_multiple_holidays_per_date.sql 中的函數嘗試更新不存在的欄位

快速執行步驟

  1. 開啟 Supabase Dashboard SQL Editor
  2. 執行 Migration 檔案: supabase/migrations/20250920120000_optimize_dimdate_for_performance.sql
  3. 測試 Holiday 編輯功能 - 應該恢復正常

技術細節

修復的錯誤清單

錯誤原因解決方式
column "holiday_names" does not exist函數更新不存在的欄位建立新版本函數 sync_holiday_to_dim_date_v2
relation "public.migration_log" does not exist依賴不存在的表移除相關 INSERT 語句
syntax error at "current_date"使用 SQL 保留字改用 loop_date 變數
column c.budget does not existcampaigns 表缺少欄位簡化權重計算邏輯
column c.is_active does not existcampaigns 表缺少欄位移除狀態檢查

新增功能(附贈)

性能優化欄位

sql
ALTER TABLE dim_date ADD:
- primary_holiday_name TEXT     -- 主要假期名稱
- holiday_count INTEGER         -- 假期數量
- primary_campaign_name TEXT    -- 主要活動名稱
- campaign_count INTEGER        -- 活動數量
- has_campaigns BOOLEAN         -- 快速查詢標記

便捷查詢視圖

  • dim_date_simple - 基本資訊快速查詢
  • dim_date_detailed - 完整資訊詳細分析

驗證測試

快速驗證(執行後立即測試)

sql
-- 1. 檢查新欄位是否建立成功
SELECT column_name FROM information_schema.columns
WHERE table_name = 'dim_date'
AND column_name IN ('primary_holiday_name', 'holiday_count', 'primary_campaign_name', 'campaign_count', 'has_campaigns');
-- 預期:返回 5 筆記錄

-- 2. 檢查新函數是否存在
SELECT proname FROM pg_proc
WHERE proname = 'sync_holiday_to_dim_date_v2';
-- 預期:返回 1 筆記錄

-- 3. 檢查便捷視圖
SELECT * FROM dim_date_simple LIMIT 1;
SELECT * FROM dim_date_detailed LIMIT 1;
-- 預期:兩個查詢都成功執行

-- 4. 測試 Holiday 編輯功能
UPDATE holidays
SET name = name || ' (測試)'
WHERE id = (SELECT id FROM holidays LIMIT 1);
-- 預期:成功執行,無 "holiday_names" 錯誤

前端功能測試

  1. 進入 Holiday 管理頁面
  2. 編輯任一假期
  3. 保存變更
  4. 確認沒有錯誤訊息

注意事項

Campaign 權重簡化

由於 campaigns 表缺少 budgetroiis_active 欄位,權重計算已簡化為基於建立時間(較新的活動優先)。這不影響核心功能,未來可根據需要調整。

其他錯誤

執行時看到的 UUID 格式錯誤等來自 seed-test.sql,與 Holiday 修復無關,可忽略。

解決方案設計理念

為什麼建立新 Migration 而非修改舊檔案?

  1. 安全性: 舊 migration 已提交到 git,修改會造成環境不一致
  2. 最佳實踐: Database migration 的基本原則是不修改已執行的 migration
  3. 可追溯性: 保持完整的問題修復歷史

為什麼簡化 Campaign 權重計算?

原設計依賴不存在的欄位(budget、roi),簡化後:

  • 確保所有環境都能執行
  • 保持基本功能正常運作
  • 預留未來優化空間

📁 相關檔案

  • Migration: supabase/migrations/20250920120000_optimize_dimdate_for_performance.sql

執行時間: 約 1-2 分鐘 風險等級: 低(向後相容) 最後更新: 2025-09-20