合并分支:合并课程两步式向导与教学资源关联管理能力
This commit is contained in:
commit
9030d797f4
22 files changed
+1178
-291
No files matched your search
@@ -3,7 +3,7 @@
|
||||
-- 适用数据库: KingbaseES V009R003C018 (schema: public)
|
||||
-- 执行目标:
|
||||
-- 1. 补齐学员、教师、教室、实训场地、课程主数据新增扩展字段 (11个物理列)
|
||||
-- 2. 创建统一教学资源表 (train_resource) 及其索引与字典
|
||||
-- 2. 创建统一教学资源表及课程-资源规范关联表
|
||||
-- 3. 补齐教学资源管理菜单 (sys_menu) 与培训管理员/超级管理员角色授权 (sys_role_menu)
|
||||
-- 事务边界: 全程在显式事务 BEGIN ... COMMIT 中执行
|
||||
-- 幂等保证: 全部 DDL / DML 均具备 IF NOT EXISTS 或 NOT EXISTS 守卫,可安全重复执行
|
||||
@@ -45,10 +45,6 @@ ALTER TABLE public.train_training_site ADD COLUMN IF NOT EXISTS seat_arrange VAR
|
||||
COMMENT ON COLUMN public.train_training_site.major IS '适用专业/实训工种';
|
||||
COMMENT ON COLUMN public.train_training_site.seat_arrange IS '工位布局形式';
|
||||
|
||||
-- 1.5 课程表 train_course 增加 资源ID关联串 (逗号分隔资源ID)
|
||||
ALTER TABLE public.train_course ADD COLUMN IF NOT EXISTS resource_id VARCHAR(500);
|
||||
COMMENT ON COLUMN public.train_course.resource_id IS '关联教学资源ID集合 (逗号分隔)';
|
||||
|
||||
-- =============================================================================
|
||||
-- 步骤 2: 创建统一教学资源表 (train_resource)
|
||||
-- =============================================================================
|
||||
@@ -81,6 +77,9 @@ COMMENT ON COLUMN public.train_resource.del_flag IS '删除标志 (0:存在, 2:
|
||||
CREATE INDEX IF NOT EXISTS idx_train_resource_type ON public.train_resource (resource_type);
|
||||
CREATE INDEX IF NOT EXISTS idx_train_resource_status ON public.train_resource (status);
|
||||
|
||||
-- 步骤 2 结束: 教学资源表创建完成。课程资源多对多关联见增量迁移脚本 012。
|
||||
|
||||
|
||||
-- =============================================================================
|
||||
-- 步骤 3: 补齐教学资源类型字典 (train_resource_type)
|
||||
-- =============================================================================
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
-- ==============================================================================
|
||||
-- RailwaySystem 数据库 V2 增量迁移脚本: 012_pilot_20261010_course_resource_relation.sql
|
||||
-- 适用数据库: KingbaseES V009R003C018 (schema: public)
|
||||
-- 执行目标: 创建课程与教学资源规范多对多关系表 (train_course_resource),迁移历史关联,保留物理字段兼容
|
||||
-- 架构方案: 改进 B+ 方案 (唯一权威存储为 train_course_resource;保留 train_course.resource_id 禁止 DROP COLUMN)
|
||||
-- ==============================================================================
|
||||
|
||||
BEGIN;
|
||||
|
||||
-- 步骤 1: 创建规范课程资源多对多关联表
|
||||
CREATE TABLE IF NOT EXISTS public.train_course_resource (
|
||||
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
|
||||
c_id VARCHAR(32) NOT NULL,
|
||||
resource_id VARCHAR(32) NOT NULL,
|
||||
sort_no INTEGER DEFAULT 0,
|
||||
create_by VARCHAR(64),
|
||||
create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
CONSTRAINT pk_train_course_resource PRIMARY KEY (id)
|
||||
);
|
||||
|
||||
COMMENT ON TABLE public.train_course_resource IS '课程与教学资源关联表 (N:M 唯一权威存储)';
|
||||
COMMENT ON COLUMN public.train_course_resource.id IS '主键ID';
|
||||
COMMENT ON COLUMN public.train_course_resource.c_id IS '课程ID';
|
||||
COMMENT ON COLUMN public.train_course_resource.resource_id IS '教学资源ID';
|
||||
COMMENT ON COLUMN public.train_course_resource.sort_no IS '课程内资源排序号';
|
||||
COMMENT ON COLUMN public.train_course_resource.create_by IS '绑定操作人';
|
||||
COMMENT ON COLUMN public.train_course_resource.create_time IS '绑定时间';
|
||||
|
||||
-- 步骤 2: 创建索引与唯一约束 (保证幂等防重复)
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS uq_course_resource
|
||||
ON public.train_course_resource (c_id, resource_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_course_resource_course
|
||||
ON public.train_course_resource (c_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_course_resource_resource
|
||||
ON public.train_course_resource (resource_id);
|
||||
|
||||
-- 外键约束 (如果不存在则添加)
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_cr_course') THEN
|
||||
ALTER TABLE public.train_course_resource
|
||||
ADD CONSTRAINT fk_cr_course FOREIGN KEY (c_id)
|
||||
REFERENCES public.train_course (c_id);
|
||||
END IF;
|
||||
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_cr_resource') THEN
|
||||
ALTER TABLE public.train_course_resource
|
||||
ADD CONSTRAINT fk_cr_resource FOREIGN KEY (resource_id)
|
||||
REFERENCES public.train_resource (resource_id);
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- 步骤 3: 幂等迁移历史 train_course.resource_id 字段数据
|
||||
-- 仅当 train_course.resource_id 非空且关联在 train_resource 中有效(del_flag='0')时迁移,
|
||||
-- 且 ON CONFLICT (c_id, resource_id) DO NOTHING 避免覆盖已存在的关联,亦不破坏已解绑关系。
|
||||
DO $$
|
||||
BEGIN
|
||||
IF EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = 'public'
|
||||
AND table_name = 'train_course'
|
||||
AND column_name = 'resource_id'
|
||||
) THEN
|
||||
INSERT INTO public.train_course_resource
|
||||
(c_id, resource_id, sort_no, create_by, create_time)
|
||||
SELECT legacy.c_id,
|
||||
legacy.resource_id,
|
||||
legacy.sort_no,
|
||||
'migration_012',
|
||||
CURRENT_TIMESTAMP
|
||||
FROM (
|
||||
SELECT c.c_id,
|
||||
trim(parts.resource_id) AS resource_id,
|
||||
CAST(parts.ordinality - 1 AS INTEGER) AS sort_no
|
||||
FROM public.train_course c
|
||||
CROSS JOIN LATERAL regexp_split_to_table(c.resource_id, ',')
|
||||
WITH ORDINALITY AS parts(resource_id, ordinality)
|
||||
WHERE c.resource_id IS NOT NULL
|
||||
AND trim(c.resource_id) <> ''
|
||||
) legacy
|
||||
JOIN public.train_resource r
|
||||
ON r.resource_id = legacy.resource_id
|
||||
AND r.del_flag = '0'
|
||||
WHERE legacy.resource_id <> ''
|
||||
ON CONFLICT (c_id, resource_id) DO NOTHING;
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- 注意:根据改进 B+ 方案决策,train_course.resource_id 物理字段必须永久保留(供向下兼容只读/兼容调用),
|
||||
-- 禁止执行 ALTER TABLE train_course DROP COLUMN resource_id!
|
||||
|
||||
COMMIT;
|
||||
+2
-4
@@ -14,8 +14,8 @@ DELETE FROM public.sys_menu WHERE menu_id IN (2270, 2271, 2272);
|
||||
DELETE FROM public.sys_dict_data WHERE dict_type = 'train_resource_type';
|
||||
DELETE FROM public.sys_dict_type WHERE dict_type = 'train_resource_type';
|
||||
|
||||
-- 3. 删除教学资源表及索引
|
||||
DROP TABLE IF EXISTS public.train_resource CASCADE;
|
||||
-- 3. 删除教学资源表及索引 (无 CASCADE 保护数据安全;train_course_resource 回滚见 012 回滚脚本)
|
||||
DROP TABLE IF EXISTS public.train_resource;
|
||||
|
||||
-- 4. 删除主数据扩展列
|
||||
ALTER TABLE public.train_student DROP COLUMN IF EXISTS avatar;
|
||||
@@ -33,6 +33,4 @@ ALTER TABLE public.train_classroom_info DROP COLUMN IF EXISTS seat_arrange;
|
||||
ALTER TABLE public.train_training_site DROP COLUMN IF EXISTS major;
|
||||
ALTER TABLE public.train_training_site DROP COLUMN IF EXISTS seat_arrange;
|
||||
|
||||
ALTER TABLE public.train_course DROP COLUMN IF EXISTS resource_id;
|
||||
|
||||
COMMIT;
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
-- ==============================================================================
|
||||
-- RailwaySystem 数据库 V2 回滚脚本: 012_pilot_20261010_course_resource_relation_rollback.sql
|
||||
-- 适用数据库: KingbaseES V009R003C018 (schema: public)
|
||||
-- 执行目标: 安全回滚 012_pilot_20261010_course_resource_relation.sql 的变更
|
||||
-- ==============================================================================
|
||||
|
||||
BEGIN;
|
||||
|
||||
-- 移除外键约束与关联表(禁止 CASCADE)
|
||||
ALTER TABLE IF EXISTS public.train_course_resource DROP CONSTRAINT IF EXISTS fk_cr_course;
|
||||
ALTER TABLE IF EXISTS public.train_course_resource DROP CONSTRAINT IF EXISTS fk_cr_resource;
|
||||
DROP TABLE IF EXISTS public.train_course_resource;
|
||||
|
||||
COMMIT;
|
||||
Reference in new issue
Block a user