修正
This commit is contained in:
100
backend/sql/admin_migration_add_fields.sql
Normal file
100
backend/sql/admin_migration_add_fields.sql
Normal file
@@ -0,0 +1,100 @@
|
||||
-- 【管理员执行】数据库迁移脚本
|
||||
-- 使用 postgres 或其他超级用户执行此脚本
|
||||
|
||||
-- ============================================================================
|
||||
-- 【步骤 1】添加缺失的字段到 journal_entries 表
|
||||
-- ============================================================================
|
||||
|
||||
-- 检查并添加 is_latest 字段
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_name = 'journal_entries' AND column_name = 'is_latest'
|
||||
) THEN
|
||||
ALTER TABLE journal_entries ADD COLUMN is_latest BOOLEAN DEFAULT true;
|
||||
RAISE NOTICE '✓ 字段 is_latest 已添加';
|
||||
ELSE
|
||||
RAISE NOTICE '✓ 字段 is_latest 已存在';
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- 检查并添加 revision_count 字段
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_name = 'journal_entries' AND column_name = 'revision_count'
|
||||
) THEN
|
||||
ALTER TABLE journal_entries ADD COLUMN revision_count INTEGER DEFAULT 1;
|
||||
RAISE NOTICE '✓ 字段 revision_count 已添加';
|
||||
ELSE
|
||||
RAISE NOTICE '✓ 字段 revision_count 已存在';
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- 检查并添加 original_entry_id 字段
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_name = 'journal_entries' AND column_name = 'original_entry_id'
|
||||
) THEN
|
||||
ALTER TABLE journal_entries ADD COLUMN original_entry_id INTEGER;
|
||||
RAISE NOTICE '✓ 字段 original_entry_id 已添加';
|
||||
ELSE
|
||||
RAISE NOTICE '✓ 字段 original_entry_id 已存在';
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- ============================================================================
|
||||
-- 【步骤 2】添加外键约束(如果字段已添加)
|
||||
-- ============================================================================
|
||||
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.table_constraints
|
||||
WHERE table_name = 'journal_entries' AND constraint_name = 'fk_original_entry_id'
|
||||
) THEN
|
||||
ALTER TABLE journal_entries
|
||||
ADD CONSTRAINT fk_original_entry_id
|
||||
FOREIGN KEY (original_entry_id)
|
||||
REFERENCES journal_entries(journal_entry_id)
|
||||
ON DELETE CASCADE;
|
||||
RAISE NOTICE '✓ 外键约束已添加';
|
||||
ELSE
|
||||
RAISE NOTICE '✓ 外键约束已存在';
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- ============================================================================
|
||||
-- 【步骤 3】创建索引以优化查询
|
||||
-- ============================================================================
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_journal_entries_is_latest
|
||||
ON journal_entries(is_latest, entry_date);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_journal_entries_original_entry_id
|
||||
ON journal_entries(original_entry_id);
|
||||
|
||||
-- ============================================================================
|
||||
-- 【步骤 4】验证迁移结果
|
||||
-- ============================================================================
|
||||
|
||||
SELECT 'Migration Verification:' as status;
|
||||
|
||||
SELECT column_name, data_type, is_nullable
|
||||
FROM information_schema.columns
|
||||
WHERE table_name = 'journal_entries'
|
||||
AND column_name IN ('is_latest', 'revision_count', 'original_entry_id')
|
||||
ORDER BY ordinal_position;
|
||||
|
||||
SELECT 'Indexes:' as status;
|
||||
|
||||
SELECT indexname
|
||||
FROM pg_indexes
|
||||
WHERE tablename = 'journal_entries'
|
||||
AND (indexname LIKE 'idx_journal_entries_is_latest' OR indexname LIKE 'idx_journal_entries_original_entry_id');
|
||||
|
||||
SELECT '✓ 迁移完成!' as complete;
|
||||
30
backend/sql/migration_add_revision_tracking.sql
Normal file
30
backend/sql/migration_add_revision_tracking.sql
Normal file
@@ -0,0 +1,30 @@
|
||||
-- Migration: Add is_latest and revision tracking columns
|
||||
|
||||
-- 1. 添加新欄位到 journal_entries
|
||||
ALTER TABLE journal_entries
|
||||
ADD COLUMN IF NOT EXISTS is_latest BOOLEAN DEFAULT true,
|
||||
ADD COLUMN IF NOT EXISTS revision_count INTEGER DEFAULT 1,
|
||||
ADD COLUMN IF NOT EXISTS original_entry_id INTEGER REFERENCES journal_entries(journal_entry_id) ON DELETE CASCADE;
|
||||
|
||||
-- 2. 處理現有數據
|
||||
-- 將所有已刪除的交易標記為 is_latest = false
|
||||
UPDATE journal_entries
|
||||
SET is_latest = false
|
||||
WHERE is_deleted = true AND is_latest IS NOT NULL;
|
||||
|
||||
-- 將所有活躍交易標記為 is_latest = true
|
||||
UPDATE journal_entries
|
||||
SET is_latest = true
|
||||
WHERE is_deleted = false AND is_latest IS NULL;
|
||||
|
||||
-- 3. 創建索引以提高查詢性能
|
||||
CREATE INDEX IF NOT EXISTS idx_journal_entries_is_latest
|
||||
ON journal_entries(is_latest, entry_date);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_journal_entries_original_entry_id
|
||||
ON journal_entries(original_entry_id);
|
||||
|
||||
-- 4. 添加註釋說明
|
||||
COMMENT ON COLUMN journal_entries.is_latest IS '是否為最新版本(試算表使用此欄位過濾)';
|
||||
COMMENT ON COLUMN journal_entries.revision_count IS '修正版次(原始=1, 第1次修正=2, ...)';
|
||||
COMMENT ON COLUMN journal_entries.original_entry_id IS '指向原始交易(如果是修正版本)';
|
||||
70
backend/sql/migration_add_revision_tracking_safe.sql
Normal file
70
backend/sql/migration_add_revision_tracking_safe.sql
Normal file
@@ -0,0 +1,70 @@
|
||||
-- 【重要】此腳本需由數據庫擁有者或管理員在 PostgreSQL 中執行
|
||||
-- 在 PostgreSQL 客戶端運行 (如 pgAdmin 或 psql):
|
||||
-- psql -h 192.168.0.61 -p 55432 -U postgres -d njts_acct -f migration_add_revision_tracking.sql
|
||||
|
||||
-- 如果使用 Docker:
|
||||
-- docker exec <postgres_container> psql -U postgres -d njts_acct -c "copy below commands"
|
||||
|
||||
-- ============================================================================
|
||||
-- 【步驟 1】添加新欄位(如果不存在)
|
||||
-- ============================================================================
|
||||
|
||||
-- 檢查和添加 is_latest 欄位
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (SELECT 1 FROM information_schema.columns
|
||||
WHERE table_name = 'journal_entries' AND column_name = 'is_latest') THEN
|
||||
ALTER TABLE journal_entries ADD COLUMN is_latest BOOLEAN DEFAULT true;
|
||||
RAISE NOTICE '欄位 is_latest 已添加';
|
||||
ELSE
|
||||
RAISE NOTICE '欄位 is_latest 已存在';
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- 檢查和添加 revision_count 欄位
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (SELECT 1 FROM information_schema.columns
|
||||
WHERE table_name = 'journal_entries' AND column_name = 'revision_count') THEN
|
||||
ALTER TABLE journal_entries ADD COLUMN revision_count INTEGER DEFAULT 1;
|
||||
RAISE NOTICE '欄位 revision_count 已添加';
|
||||
ELSE
|
||||
RAISE NOTICE '欄位 revision_count 已存在';
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- 檢查和添加 original_entry_id 欄位
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (SELECT 1 FROM information_schema.columns
|
||||
WHERE table_name = 'journal_entries' AND column_name = 'original_entry_id') THEN
|
||||
ALTER TABLE journal_entries ADD COLUMN original_entry_id INTEGER;
|
||||
ALTER TABLE journal_entries ADD CONSTRAINT fk_original_entry_id
|
||||
FOREIGN KEY (original_entry_id) REFERENCES journal_entries(journal_entry_id) ON DELETE CASCADE;
|
||||
RAISE NOTICE '欄位 original_entry_id 已添加';
|
||||
ELSE
|
||||
RAISE NOTICE '欄位 original_entry_id 已存在';
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- ============================================================================
|
||||
-- 【步驟 2】創建索引(如果不存在)
|
||||
-- ============================================================================
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_journal_entries_is_latest
|
||||
ON journal_entries(is_latest, entry_date);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_journal_entries_original_entry_id
|
||||
ON journal_entries(original_entry_id);
|
||||
|
||||
-- ============================================================================
|
||||
-- 【步驟 3】驗證
|
||||
-- ============================================================================
|
||||
|
||||
SELECT 'Migration completed. Column info:' as status;
|
||||
|
||||
SELECT column_name, data_type, is_nullable
|
||||
FROM information_schema.columns
|
||||
WHERE table_name = 'journal_entries'
|
||||
AND column_name IN ('is_latest', 'revision_count', 'original_entry_id')
|
||||
ORDER BY ordinal_position;
|
||||
92
backend/sql/migration_revision_tracking_manual.sql
Normal file
92
backend/sql/migration_revision_tracking_manual.sql
Normal file
@@ -0,0 +1,92 @@
|
||||
-- ============================================================================
|
||||
-- 【手動數據庫遷移腳本】版本追踪系統
|
||||
-- 如果自動遷移失敗,請由數據庫管理員手動執行此腳本
|
||||
-- ============================================================================
|
||||
|
||||
-- 【步驟 1】添加 is_latest 字段
|
||||
-- 用於標記該交易版本是否為最新版本(true = 最新,false = 已過時)
|
||||
ALTER TABLE journal_entries
|
||||
ADD COLUMN IF NOT EXISTS is_latest BOOLEAN DEFAULT true;
|
||||
|
||||
-- 【步驟 2】添加 revision_count 字段
|
||||
-- 用於追踪修正版本(1 = 原始,2 = 第一次修正,3 = 第二次修正,...)
|
||||
ALTER TABLE journal_entries
|
||||
ADD COLUMN IF NOT EXISTS revision_count INTEGER DEFAULT 1;
|
||||
|
||||
-- 【步驟 3】添加 original_entry_id 字段
|
||||
-- 用於指向原始交易 ID(NULL = 這是原始交易,>0 = 這是對ID的修正版本)
|
||||
ALTER TABLE journal_entries
|
||||
ADD COLUMN IF NOT EXISTS original_entry_id INTEGER;
|
||||
|
||||
-- 【步驟 4】創建性能索引
|
||||
-- 用於快速查詢最新版本的交易(試算表查詢會經常使用)
|
||||
CREATE INDEX IF NOT EXISTS idx_journal_entries_is_latest
|
||||
ON journal_entries(is_latest, entry_date DESC);
|
||||
|
||||
-- 【步驟 5】創建追踪索引
|
||||
-- 用於快速查詢指定交易的所有修正版本
|
||||
CREATE INDEX IF NOT EXISTS idx_journal_entries_original_id
|
||||
ON journal_entries(original_entry_id) WHERE original_entry_id IS NOT NULL;
|
||||
|
||||
-- ============================================================================
|
||||
-- 【驗證】
|
||||
-- ============================================================================
|
||||
-- 執行以下查詢確認字段已添加:
|
||||
SELECT column_name, data_type, column_default
|
||||
FROM information_schema.columns
|
||||
WHERE table_name = 'journal_entries'
|
||||
AND column_name IN ('is_latest', 'revision_count', 'original_entry_id')
|
||||
ORDER BY ordinal_position DESC;
|
||||
|
||||
-- 查詢索引是否已創建:
|
||||
SELECT indexname, indexdef
|
||||
FROM pg_indexes
|
||||
WHERE tablename = 'journal_entries'
|
||||
AND indexname LIKE 'idx_journal_entries%';
|
||||
|
||||
-- ============================================================================
|
||||
-- 【可選】數據初始化
|
||||
-- ============================================================================
|
||||
-- 如果表中已有舊數據,執行以下操作以確保一致性:
|
||||
|
||||
-- 使用 begin;...commit; 作為事務邊界
|
||||
BEGIN;
|
||||
|
||||
-- 確保所有現有交易都被標記為最新版本
|
||||
UPDATE journal_entries
|
||||
SET is_latest = true
|
||||
WHERE is_latest IS NULL;
|
||||
|
||||
-- 確保所有現有交易的 revision_count 都至少為 1
|
||||
UPDATE journal_entries
|
||||
SET revision_count = 1
|
||||
WHERE revision_count IS NULL;
|
||||
|
||||
-- 提交更改
|
||||
COMMIT;
|
||||
|
||||
-- ============================================================================
|
||||
-- 【完成】
|
||||
-- ============================================================================
|
||||
-- 遷移完成!系統現在支持版本追踪。
|
||||
--
|
||||
-- 關鍵概念:
|
||||
-- - is_latest = true: 當前最新版本,應該在試算表和列表中顯示
|
||||
-- - is_latest = false: 已過時的版本,通常只在修正歷史中顯示
|
||||
-- - revision_count: 版本編號(1=原始,2=第一次修正,...)
|
||||
-- - original_entry_id: 指向原始交易,NULL 表示這是原始交易
|
||||
--
|
||||
-- 常見查詢:
|
||||
-- 1. 獲取所有最新交易(用於試算表):
|
||||
-- SELECT * FROM journal_entries WHERE is_latest = true AND is_deleted = false;
|
||||
--
|
||||
-- 2. 獲取指定交易的修正歷史:
|
||||
-- SELECT * FROM journal_entries
|
||||
-- WHERE journal_entry_id = 123 OR original_entry_id = 123
|
||||
-- ORDER BY revision_count ASC;
|
||||
--
|
||||
-- 3. 獲取修正後的版本:
|
||||
-- SELECT * FROM journal_entries
|
||||
-- WHERE original_entry_id IS NOT NULL AND is_latest = true;
|
||||
--
|
||||
-- ============================================================================
|
||||
Reference in New Issue
Block a user