From 7712a1bb3ccc46c2e73ecf92d6724130775f2b49 Mon Sep 17 00:00:00 2001 From: PIGCLOUD Date: Tue, 22 Sep 2026 22:09:47 +0800 Subject: [PATCH] =?UTF-8?q?fix(db):=20=E8=A1=A5=E9=BD=90=E6=97=A7=E7=A4=BE?= =?UTF-8?q?=E4=BA=A4=E5=87=AD=E6=8D=AE=E8=BF=81=E7=A7=BB=E5=8F=8A=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/upgrade/20260922_user_social.sql | 58 +++++++++++++++++++++++++++++ db/upgrade/README.md | 27 ++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 db/upgrade/20260922_user_social.sql create mode 100644 db/upgrade/README.md diff --git a/db/upgrade/20260922_user_social.sql b/db/upgrade/20260922_user_social.sql new file mode 100644 index 000000000..6364dc0d7 --- /dev/null +++ b/db/upgrade/20260922_user_social.sql @@ -0,0 +1,58 @@ +-- 适用:升级到独立社交身份表的既有 PIGX 数据库。 +-- 执行前备份,并通过 mysql 的 --database 指定 pigxx 或 pigxx_boot;不要对业务库重跑初始化脚本。 +-- 保留 sys_user 旧字段;仅迁移当前仍支持的平台。重复执行不会覆盖已经绑定的身份。 +-- 若同一身份绑定多个用户,或用户已有不同身份,唯一索引将阻止迁移并回滚数据,请先核对冲突。 + +CREATE TABLE IF NOT EXISTS `sys_user_social` ( + `id` bigint(20) NOT NULL COMMENT '主键ID', + `user_id` bigint(20) NOT NULL COMMENT '用户ID', + `type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '社交平台类型', + `identifier` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '唯一凭据', + `create_time` datetime NOT NULL COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_social_identifier` (`type`,`identifier`) USING BTREE, + UNIQUE KEY `uk_user_social_type` (`user_id`,`type`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户社交登录身份表'; + +DROP PROCEDURE IF EXISTS pigx_migrate_user_social_20260922; +DELIMITER $$ +CREATE PROCEDURE pigx_migrate_user_social_20260922() +BEGIN + DECLARE platform_index INT DEFAULT 0; + DECLARE legacy_column VARCHAR(32); + DECLARE platform_type VARCHAR(32); + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + ROLLBACK; + RESIGNAL; + END; + + START TRANSACTION; + WHILE platform_index < 5 DO + SET legacy_column = ELT(platform_index + 1, 'wx_openid', 'mini_openid', 'qq_openid', 'wx_cp_userid', 'wx_ding_userid'); + SET platform_type = ELT(platform_index + 1, 'WX', 'MINI', 'QQ', 'WEIXIN_CP', 'DINGTALK'); + IF EXISTS ( + SELECT 1 FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'sys_user' AND COLUMN_NAME = legacy_column + ) THEN + SET @pigx_social_migration_sql = CONCAT( + 'INSERT INTO sys_user_social (id, user_id, type, identifier, create_time) ', + 'SELECT UUID_SHORT(), u.user_id, ', QUOTE(platform_type), ', u.`', legacy_column, '`, NOW() ', + 'FROM sys_user u WHERE u.`', legacy_column, '` IS NOT NULL ', + 'AND TRIM(u.`', legacy_column, '`) <> ', QUOTE(''), ' ', + 'AND NOT EXISTS (SELECT 1 FROM sys_user_social s WHERE s.user_id = u.user_id ', + 'AND s.type = ', QUOTE(platform_type), ' AND BINARY s.identifier = BINARY u.`', legacy_column, '`)' + ); + PREPARE pigx_social_migration_stmt FROM @pigx_social_migration_sql; + EXECUTE pigx_social_migration_stmt; + DEALLOCATE PREPARE pigx_social_migration_stmt; + END IF; + SET platform_index = platform_index + 1; + END WHILE; + COMMIT; +END$$ +DELIMITER ; + +CALL pigx_migrate_user_social_20260922(); +DROP PROCEDURE pigx_migrate_user_social_20260922; +SET @pigx_social_migration_sql = NULL; diff --git a/db/upgrade/README.md b/db/upgrade/README.md new file mode 100644 index 000000000..27f4a32df --- /dev/null +++ b/db/upgrade/README.md @@ -0,0 +1,27 @@ +# 2026-09-22 数据库脚本同步 + +以 `ai-dev-next` 的 `c0b8a966b` 为参考,仅同步当前商业版代码对应的结构,不包含 AI 表、菜单、路由和镜像初始化入口。 + +## 新安装 + +单体使用 `db/0pigxx_boot.sql`;微服务按 `db/Dockerfile` 所列脚本初始化。两种模式的公共表结构已对齐,包括 utf8mb4、日志 `user_agent` 的 TEXT 类型和用户 `dept_id` 的默认值 0。 + +内置 `app`、`pig` 客户端的新安装授权类型与参考分支一致,移除 `client_credentials`;其他授权类型保持不变。服务端仍支持该授权模式,需要机器客户端时单独配置。 + +## 既有数据库 + +不要对已有数据库重跑带有 `DROP TABLE` 的初始化脚本。备份后先在数据库副本验证,根据实际部署模式选择升级文件: + +| 文件 | 适用范围 | +| --- | --- | +| `20260922_schema_alignment_boot.sql` | 单体;执行时指定目标数据库,默认部署为 `pigxx_boot` | +| `20260922_schema_alignment_services.sql` | 微服务;核对脚本内 `USE` 的各模块数据库名 | +| `20260922_user_social.sql` | 从旧版用户表迁移社交身份;单体在 `pigxx_boot` 执行,微服务在 `pigxx` 执行 | + +结构升级以本轮修改前的 `dev` 为起点,不是任意历史版本的全量升级工具;更早版本缺少的表或字段需要按实际版本补齐。MySQL DDL 会隐式提交,脚本失败后应核对已完成的语句再重跑。为同步修改 Quartz 外键关联列的字符集,脚本暂时关闭当前会话的外键检查,并在结尾恢复;执行期间停止相关写入,失败时退出该会话。微服务旧表中 `dept_id IS NULL` 的记录先转为 0,再施加非空约束。 + +社交身份脚本将 `wx_openid`、`mini_openid`、`qq_openid`、`wx_cp_userid`、`wx_ding_userid` 映射到代码中的 `WX`、`MINI`、`QQ`、`WEIXIN_CP`、`DINGTALK`。迁移保留原字段,重复执行跳过完全相同的身份映射;绑定冲突触发唯一索引错误并回滚当次数据迁移,不覆盖新绑定。该脚本使用 `UUID_SHORT()` 生成迁移记录 ID,应在同一 MySQL 实例执行,迁移期间停止账号绑定写入。 + +结构升级不会覆盖既有 OAuth 授权、第三方应用密钥、注册开关或自定义菜单。旧安装的飞书字典项及应用配置应结合 `pigx-upms/FEISHU-LOGIN.md` 核对;本目录脚本不替用户配置飞书应用。 + +动态加签的 `process_task_add_sign_record`、`assignment_origin`、`initial_user_id` 已存在于当前单体及微服务初始化脚本。本轮未改动其结构。