Holiday 編輯修復與 dim_date 優化
問題描述
錯誤訊息: column "holiday_names" of relation "dim_date" does not exist影響範圍: Holiday 編輯、新增、刪除功能完全失效 根本原因: 20250811200000_support_multiple_holidays_per_date.sql 中的函數嘗試更新不存在的欄位
快速執行步驟
- 開啟 Supabase Dashboard SQL Editor
- 執行 Migration 檔案:
supabase/migrations/20250920120000_optimize_dimdate_for_performance.sql - 測試 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 exist | campaigns 表缺少欄位 | 簡化權重計算邏輯 |
column c.is_active does not exist | campaigns 表缺少欄位 | 移除狀態檢查 |
新增功能(附贈)
性能優化欄位
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" 錯誤前端功能測試
- 進入 Holiday 管理頁面
- 編輯任一假期
- 保存變更
- 確認沒有錯誤訊息
注意事項
Campaign 權重簡化
由於 campaigns 表缺少 budget、roi、is_active 欄位,權重計算已簡化為基於建立時間(較新的活動優先)。這不影響核心功能,未來可根據需要調整。
其他錯誤
執行時看到的 UUID 格式錯誤等來自 seed-test.sql,與 Holiday 修復無關,可忽略。
解決方案設計理念
為什麼建立新 Migration 而非修改舊檔案?
- 安全性: 舊 migration 已提交到 git,修改會造成環境不一致
- 最佳實踐: Database migration 的基本原則是不修改已執行的 migration
- 可追溯性: 保持完整的問題修復歷史
為什麼簡化 Campaign 權重計算?
原設計依賴不存在的欄位(budget、roi),簡化後:
- 確保所有環境都能執行
- 保持基本功能正常運作
- 預留未來優化空間
📁 相關檔案
- Migration:
supabase/migrations/20250920120000_optimize_dimdate_for_performance.sql
執行時間: 約 1-2 分鐘 風險等級: 低(向後相容) 最後更新: 2025-09-20