-- ---------------------------- -- BOTP 规则版本快照表 + 版本号字段。 -- 转换规则(convert_rule)、反写规则(reverse_writing_rules)每保存一次,版本号 +1, -- 并追加一条全量快照记录:快照以 JSON 内联存储规则主表及其全部子表分录。 -- 请在 tenant-admin 服务指向的默认数据库执行该脚本;脚本可重复执行。 -- ---------------------------- SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- 1. 补齐版本号字段(老环境的业务表可能没有 rule_version,MySQL 不支持 ADD COLUMN IF NOT EXISTS, -- 这里用 information_schema 判断后动态执行,保证脚本可重复执行) -- ---------------------------- SET @ddl = (SELECT IF(COUNT(*) = 0, 'ALTER TABLE `convert_rule` ADD COLUMN `rule_version` int NOT NULL DEFAULT 1 COMMENT ''规则版本号''', 'DO 0') FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'convert_rule' AND column_name = 'rule_version'); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @ddl = (SELECT IF(COUNT(*) = 0, 'ALTER TABLE `reverse_writing_rules` ADD COLUMN `rule_version` int DEFAULT 1 COMMENT ''规则版本号''', 'DO 0') FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'reverse_writing_rules' AND column_name = 'rule_version'); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- ---------------------------- -- 2. 历史数据版本号兜底:乐观锁需要有非空版本号做比较基准,空值/非法值统一按首版处理。 -- 只影响版本号为空或小于 1 的行。 -- ---------------------------- UPDATE `convert_rule` SET `rule_version` = 1 WHERE `rule_version` IS NULL OR `rule_version` < 1; UPDATE `reverse_writing_rules` SET `rule_version` = 1 WHERE `rule_version` IS NULL OR `rule_version` < 1; -- ---------------------------- -- 3. 转换规则版本快照表 -- ---------------------------- CREATE TABLE IF NOT EXISTS `convert_rule_ver` ( `id` bigint NOT NULL COMMENT '主键', `rule_id` bigint NOT NULL COMMENT '所属转换规则Id(convert_rule.id)', `rule_version` int NOT NULL COMMENT '规则版本号', `snapshot_json` longtext COLLATE utf8mb4_bin COMMENT '全量快照JSON:规则主表 + 字段映射分录 + 插件分录', `remark` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '备注(新增保存/修改保存)', `create_user_id` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人登录名称', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_user_id` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新人登录名称', `update_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_convert_rule_ver_rule_version` (`rule_id`, `rule_version`) USING BTREE, KEY `idx_convert_rule_ver_rule_id` (`rule_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='转换规则版本快照'; -- ---------------------------- -- 4. 反写规则版本快照表 -- ---------------------------- CREATE TABLE IF NOT EXISTS `reverse_writing_rules_ver` ( `id` bigint NOT NULL COMMENT '主键', `rule_id` bigint NOT NULL COMMENT '所属反写规则Id(reverse_writing_rules.id)', `rule_version` int NOT NULL COMMENT '规则版本号', `snapshot_json` longtext COLLATE utf8mb4_bin COMMENT '全量快照JSON:规则主表 + 反写公式分录 + 业务规则分录', `remark` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '备注(新增保存/修改保存)', `create_user_id` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人登录名称', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_user_id` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新人登录名称', `update_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_reverse_writing_rules_ver_rule_version` (`rule_id`, `rule_version`) USING BTREE, KEY `idx_reverse_writing_rules_ver_rule_id` (`rule_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='反写规则版本快照'; SET FOREIGN_KEY_CHECKS = 1;