writeOff/docs/新租户初始化清单SQL.sql
haomingming 815aa04fe8 first
2026-05-20 18:21:39 +08:00

166 lines
5.5 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- 新租户初始化清单 SQL按模板租户复制
-- 用法:
-- 1) 先创建租户拿到 @target_tenant_id
-- 2) 以 tenant_id=1 作为模板租户执行
-- 3) 该脚本尽量幂等(重复执行不会重复插入)
SET @template_tenant_id := 1;
SET @target_tenant_id := 2; -- TODO: 改成目标租户ID
-- =====================================================
-- A. 必须初始化(权限与菜单链路)
-- 表role/menu/role_permission/role_menu
-- =====================================================
-- A1) 复制模板租户角色role_code 维度)
SET @next_role_id := (SELECT IFNULL(MAX(id), 0) FROM role);
INSERT INTO role (id, tenant_id, role_code, role_name, status, is_deleted, created_by, updated_by)
SELECT
(@next_role_id := @next_role_id + 1) AS id,
@target_tenant_id AS tenant_id,
tr.role_code,
tr.role_name,
tr.status,
0 AS is_deleted,
0 AS created_by,
0 AS updated_by
FROM role tr
LEFT JOIN role er
ON er.tenant_id=@target_tenant_id
AND er.role_code=tr.role_code
AND er.is_deleted=0
WHERE tr.tenant_id=@template_tenant_id
AND tr.is_deleted=0
AND er.id IS NULL;
-- A2) 复制模板租户菜单
INSERT INTO menu (tenant_id, menu_code, menu_name, route_path, permission_code, sort_no, status, is_deleted, created_by, updated_by)
SELECT
@target_tenant_id AS tenant_id,
tm.menu_code,
tm.menu_name,
tm.route_path,
tm.permission_code,
tm.sort_no,
tm.status,
0 AS is_deleted,
0 AS created_by,
0 AS updated_by
FROM menu tm
LEFT JOIN menu em
ON em.tenant_id=@target_tenant_id
AND em.menu_code=tm.menu_code
AND em.is_deleted=0
WHERE tm.tenant_id=@template_tenant_id
AND tm.is_deleted=0
AND em.id IS NULL;
-- A3) 复制 role_permission按 role_code 映射)
SET @next_role_perm_id := (SELECT IFNULL(MAX(id), 0) FROM role_permission);
INSERT INTO role_permission (id, tenant_id, role_id, permission_id)
SELECT
(@next_role_perm_id := @next_role_perm_id + 1) AS id,
@target_tenant_id AS tenant_id,
target_role.id AS role_id,
rp.permission_id
FROM role_permission rp
JOIN role template_role
ON template_role.tenant_id=rp.tenant_id
AND template_role.id=rp.role_id
AND template_role.is_deleted=0
JOIN role target_role
ON target_role.tenant_id=@target_tenant_id
AND target_role.role_code=template_role.role_code
AND target_role.is_deleted=0
LEFT JOIN role_permission existing_rp
ON existing_rp.tenant_id=@target_tenant_id
AND existing_rp.role_id=target_role.id
AND existing_rp.permission_id=rp.permission_id
WHERE rp.tenant_id=@template_tenant_id
AND existing_rp.id IS NULL;
-- A4) 复制 role_menu按 role_code + menu_code 映射)
SET @next_role_menu_id := (SELECT IFNULL(MAX(id), 0) FROM role_menu);
INSERT INTO role_menu (id, tenant_id, role_id, menu_id)
SELECT
(@next_role_menu_id := @next_role_menu_id + 1) AS id,
@target_tenant_id AS tenant_id,
target_role.id AS role_id,
target_menu.id AS menu_id
FROM role_menu rm
JOIN role template_role
ON template_role.tenant_id=rm.tenant_id
AND template_role.id=rm.role_id
AND template_role.is_deleted=0
JOIN menu template_menu
ON template_menu.tenant_id=rm.tenant_id
AND template_menu.id=rm.menu_id
AND template_menu.is_deleted=0
JOIN role target_role
ON target_role.tenant_id=@target_tenant_id
AND target_role.role_code=template_role.role_code
AND target_role.is_deleted=0
JOIN menu target_menu
ON target_menu.tenant_id=@target_tenant_id
AND target_menu.menu_code=template_menu.menu_code
AND target_menu.is_deleted=0
LEFT JOIN role_menu existing_rm
ON existing_rm.tenant_id=@target_tenant_id
AND existing_rm.role_id=target_role.id
AND existing_rm.menu_id=target_menu.id
WHERE rm.tenant_id=@template_tenant_id
AND existing_rm.id IS NULL;
-- =====================================================
-- B. 可选初始化(建议)
-- =====================================================
-- B1) 模板类型开关template_type_option
-- 注意type_code 是主键。若库里是“全局唯一”,目标租户可能已存在同 code。
-- 这里按 (type_code, tenant_id) 语义做幂等,重复时仅更新展示字段。
INSERT INTO template_type_option (type_code, tenant_id, type_name, status, sort_no)
SELECT
tto.type_code,
@target_tenant_id AS tenant_id,
tto.type_name,
tto.status,
tto.sort_no
FROM template_type_option tto
WHERE tto.tenant_id=@template_tenant_id
ON DUPLICATE KEY UPDATE
type_name=VALUES(type_name),
status=VALUES(status),
sort_no=VALUES(sort_no),
updated_at=CURRENT_TIMESTAMP;
-- B2) 会议字段字典meeting_field
INSERT INTO meeting_field (tenant_id, field_code, field_name, field_values, scope_type, project_id, sort_no, status, is_deleted, created_by, updated_by)
SELECT
@target_tenant_id AS tenant_id,
mf.field_code,
mf.field_name,
mf.field_values,
mf.scope_type,
NULL AS project_id,
mf.sort_no,
mf.status,
0 AS is_deleted,
0 AS created_by,
0 AS updated_by
FROM meeting_field mf
LEFT JOIN meeting_field emf
ON emf.tenant_id=@target_tenant_id
AND emf.field_code=mf.field_code
AND emf.is_deleted=0
WHERE mf.tenant_id=@template_tenant_id
AND mf.is_deleted=0
AND emf.id IS NULL;
-- =====================================================
-- C. 不建议初始化(运行数据表,仅业务发生时产生)
-- project/meeting/audit*/finance*/notification_task/export_task/operation_audit_log 等
-- =====================================================