71 lines
3.1 KiB
SQL
71 lines
3.1 KiB
SQL
|
|
-- P4a Task 7:用户同步域(A29/T30 语义,mock 源先行)。
|
|||
|
|
-- 校对手决:Prisma 生成 DDL 固定 utf8mb4_unicode_ci,逐表改写为库级约定的
|
|||
|
|
-- utf8mb4_0900_bin(sourceSystem/externalUserId/code 等字符串列的大小写
|
|||
|
|
-- 敏感唯一/比较语义依赖它)。
|
|||
|
|
-- · user_sync_runs.cursor 为 VarChar(128):G4 真实源可能出现非数值游标;
|
|||
|
|
-- mock 源恒为数值串(源版本高水位),API 层投影为契约 int64。
|
|||
|
|
-- · external_user_mappings.userId 为扁平字符串外键(无 FK,同相册域约定:
|
|||
|
|
-- 用户注销等跨域删除语义由应用层决策,且减轻 TRUNCATE 隔离负担)。
|
|||
|
|
-- · user_sync_state 单行状态表:迁移内种子行(固定 id 见
|
|||
|
|
-- USER_SYNC_STATE_SINGLETON_ID;reset.ts TRUNCATE 后重种同值)。
|
|||
|
|
-- `trigger` 为 MySQL 保留字:Prisma 查询恒反引号标识符,本迁移同样反引号。
|
|||
|
|
|
|||
|
|
-- CreateTable
|
|||
|
|
CREATE TABLE `user_sync_runs` (
|
|||
|
|
`id` VARCHAR(191) NOT NULL,
|
|||
|
|
`trigger` VARCHAR(16) NOT NULL,
|
|||
|
|
`state` VARCHAR(16) NOT NULL DEFAULT 'running',
|
|||
|
|
`cursor` VARCHAR(128) NULL,
|
|||
|
|
`counts` JSON NOT NULL,
|
|||
|
|
`startedAt` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
|
|||
|
|
`finishedAt` DATETIME(6) NULL,
|
|||
|
|
`error` VARCHAR(1024) NULL,
|
|||
|
|
|
|||
|
|
INDEX `user_sync_runs_startedAt_idx`(`startedAt`),
|
|||
|
|
PRIMARY KEY (`id`)
|
|||
|
|
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin;
|
|||
|
|
|
|||
|
|
-- CreateTable
|
|||
|
|
CREATE TABLE `user_sync_errors` (
|
|||
|
|
`id` VARCHAR(191) NOT NULL,
|
|||
|
|
`runId` VARCHAR(64) NOT NULL,
|
|||
|
|
`externalUserId` VARCHAR(64) NULL,
|
|||
|
|
`code` VARCHAR(64) NOT NULL,
|
|||
|
|
`detail` VARCHAR(1024) NOT NULL,
|
|||
|
|
`createdAt` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
|
|||
|
|
|
|||
|
|
INDEX `user_sync_errors_runId_idx`(`runId`),
|
|||
|
|
PRIMARY KEY (`id`)
|
|||
|
|
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin;
|
|||
|
|
|
|||
|
|
-- CreateTable
|
|||
|
|
CREATE TABLE `external_user_mappings` (
|
|||
|
|
`id` VARCHAR(191) NOT NULL,
|
|||
|
|
`userId` VARCHAR(64) NOT NULL,
|
|||
|
|
`sourceSystem` VARCHAR(32) NOT NULL DEFAULT 'mock',
|
|||
|
|
`externalUserId` VARCHAR(64) NOT NULL,
|
|||
|
|
`sourceVersion` INTEGER NOT NULL DEFAULT 0,
|
|||
|
|
`createdAt` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
|
|||
|
|
|
|||
|
|
INDEX `external_user_mappings_userId_idx`(`userId`),
|
|||
|
|
UNIQUE INDEX `external_user_mappings_sourceSystem_externalUserId_key`(`sourceSystem`, `externalUserId`),
|
|||
|
|
PRIMARY KEY (`id`)
|
|||
|
|
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin;
|
|||
|
|
|
|||
|
|
-- CreateTable
|
|||
|
|
CREATE TABLE `user_sync_state` (
|
|||
|
|
`id` VARCHAR(191) NOT NULL,
|
|||
|
|
`lastRunAt` DATETIME(6) NULL,
|
|||
|
|
`lastSuccessAt` DATETIME(6) NULL,
|
|||
|
|
`cursor` VARCHAR(128) NULL,
|
|||
|
|
`runCount` INTEGER NOT NULL DEFAULT 0,
|
|||
|
|
`updatedAt` DATETIME(6) NOT NULL,
|
|||
|
|
|
|||
|
|
PRIMARY KEY (`id`)
|
|||
|
|
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin;
|
|||
|
|
|
|||
|
|
-- 单行种子(引擎 upsert 兜底,但迁移种子保证常规路径下不变量成立——
|
|||
|
|
-- status 端点直接读本行,缺行视作「从未运行」)。
|
|||
|
|
INSERT INTO `user_sync_state` (`id`, `lastRunAt`, `lastSuccessAt`, `cursor`, `runCount`, `updatedAt`)
|
|||
|
|
VALUES ('user-sync-state-single-row', NULL, NULL, NULL, 0, CURRENT_TIMESTAMP(6));
|