Files
junhong_cmp_fiber/migrations/000163_add_package_usage_terms_snapshots.up.sql

33 lines
1.9 KiB
PL/PgSQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- 为套餐使用记录增加购买时不可变计时条款快照;空值和零值保留为历史未快照标记。
ALTER TABLE tb_package_usage
ADD COLUMN expiry_base_snapshot VARCHAR(30) NOT NULL DEFAULT '',
ADD COLUMN calendar_type_snapshot VARCHAR(20) NOT NULL DEFAULT '',
ADD COLUMN duration_months_snapshot INTEGER NOT NULL DEFAULT 0,
ADD COLUMN duration_days_snapshot INTEGER NOT NULL DEFAULT 0;
COMMENT ON COLUMN tb_package_usage.expiry_base_snapshot IS '购买时生效条件快照,空字符串表示历史未快照';
COMMENT ON COLUMN tb_package_usage.calendar_type_snapshot IS '购买时周期类型快照,空字符串表示历史未快照';
COMMENT ON COLUMN tb_package_usage.duration_months_snapshot IS '购买时月数快照0表示未使用或历史未快照';
COMMENT ON COLUMN tb_package_usage.duration_days_snapshot IS '购买时天数快照0表示未使用或历史未快照';
-- 触发器只校验新记录及快照字段变更,历史空快照仍可更新状态等非快照字段。
CREATE OR REPLACE FUNCTION validate_package_usage_terms_snapshot()
RETURNS TRIGGER AS $$
BEGIN
IF NEW.expiry_base_snapshot NOT IN ('from_purchase', 'from_activation')
OR NOT (
(NEW.calendar_type_snapshot = 'natural_month' AND NEW.duration_months_snapshot > 0 AND NEW.duration_days_snapshot = 0)
OR (NEW.calendar_type_snapshot = 'by_day' AND NEW.duration_days_snapshot > 0 AND NEW.duration_months_snapshot = 0)
) THEN
RAISE EXCEPTION '套餐使用记录计时快照不完整或无效';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trg_validate_package_usage_terms_snapshot
BEFORE INSERT OR UPDATE OF expiry_base_snapshot, calendar_type_snapshot, duration_months_snapshot, duration_days_snapshot
ON tb_package_usage
FOR EACH ROW
EXECUTE FUNCTION validate_package_usage_terms_snapshot();