fix(db): 补齐旧社交凭据迁移及升级说明

This commit is contained in:
PIGCLOUD committed 2026-09-22 22:09:47 +08:00
1 parent 816a63f0c2
commit 7712a1bb3c
2 files changed
+85

No files matched your search

+58
View File
@@ -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;
+27
View File
@@ -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` 已存在于当前单体及微服务初始化脚本。本轮未改动其结构。