Files
java-template/docs/sys_user_org_migration.sql
T

120 lines
4.4 KiB
SQL
Raw 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.
-- ===============================================================================
-- sys_user表增加org_id和org_name字段的数据库迁移脚本
-- 执行时间:预计2-5分钟(取决于数据量)
-- ===============================================================================
-- 第一步:添加字段到sys_user表
ALTER TABLE sys_user
ADD COLUMN org_id BIGINT NULL COMMENT '组织ID,直接关联sys_org_info.id',
ADD COLUMN org_name VARCHAR(100) NULL COMMENT '组织名称,冗余字段用于快速查询';
-- 第二步:创建索引以优化查询性能
CREATE INDEX idx_sys_user_org_id ON sys_user(org_id);
CREATE INDEX idx_sys_user_customer_org ON sys_user(customer_id, org_id);
CREATE INDEX idx_sys_user_customer_org_status ON sys_user(customer_id, org_id, status, is_deleted);
-- 第三步:数据迁移 - 从sys_user_org关联表同步数据到sys_user表
-- 注意:这里假设关联表名为sys_user_org和组织表名为sys_org_info
-- 请根据实际表名调整
-- 3.1 迁移策略1:直接从用户-组织关联表迁移(适用于有sys_user_org关联表的情况)
UPDATE sys_user u
INNER JOIN (
SELECT
uo.user_id,
uo.org_id,
COALESCE(o.name, oi.name) as org_name
FROM sys_user_org uo
LEFT JOIN sys_org_info o ON uo.org_id = o.id AND o.is_deleted = 0
LEFT JOIN sys_org_units oi ON uo.org_id = oi.id AND oi.is_deleted = 0
WHERE uo.is_deleted = 0
) org_data ON u.id = org_data.user_id
SET
u.org_id = org_data.org_id,
u.org_name = org_data.org_name
WHERE u.is_deleted = 0;
-- 3.2 迁移策略2:如果没有关联表,通过其他方式确定用户的组织归属
-- 例如:通过设备信息、部门编码等推导组织关系
-- UPDATE sys_user u
-- INNER JOIN t_device_info d ON u.device_sn = d.serial_number
-- INNER JOIN sys_org_info o ON d.dept_id = o.id
-- SET u.org_id = o.id, u.org_name = o.name
-- WHERE u.is_deleted = 0 AND d.is_deleted = 0 AND o.is_deleted = 0;
-- 第四步:数据完整性检查
-- 检查迁移结果统计
SELECT
COUNT(*) as total_users,
COUNT(org_id) as users_with_org_id,
COUNT(org_name) as users_with_org_name,
ROUND(COUNT(org_id) * 100.0 / COUNT(*), 2) as coverage_percentage
FROM sys_user
WHERE is_deleted = 0;
-- 检查组织分布
SELECT
org_name,
COUNT(*) as user_count
FROM sys_user
WHERE is_deleted = 0 AND org_name IS NOT NULL
GROUP BY org_name
ORDER BY user_count DESC;
-- 第五步:清理和优化(可选)
-- 清理空白的组织名称
UPDATE sys_user
SET org_name = '未分配'
WHERE is_deleted = 0 AND (org_name IS NULL OR org_name = '');
-- 更新表统计信息以优化查询性能
ANALYZE TABLE sys_user;
-- ===============================================================================
-- 回滚脚本(如果需要撤销更改)
-- ===============================================================================
-- 警告:执行回滚前请确保数据已备份
-- DROP INDEX IF EXISTS idx_sys_user_org_id;
-- DROP INDEX IF EXISTS idx_sys_user_customer_org;
-- DROP INDEX IF EXISTS idx_sys_user_customer_org_status;
-- ALTER TABLE sys_user DROP COLUMN org_id, DROP COLUMN org_name;
-- ===============================================================================
-- 验证脚本
-- ===============================================================================
-- 验证数据一致性:检查用户表的org_name与组织表的name是否一致
SELECT
u.id as user_id,
u.user_name,
u.org_id,
u.org_name as user_org_name,
COALESCE(o.name, oi.name) as actual_org_name,
CASE
WHEN u.org_name = COALESCE(o.name, oi.name) THEN 'MATCH'
ELSE 'MISMATCH'
END as status
FROM sys_user u
LEFT JOIN sys_org_info o ON u.org_id = o.id AND o.is_deleted = 0
LEFT JOIN sys_org_units oi ON u.org_id = oi.id AND oi.is_deleted = 0
WHERE u.is_deleted = 0 AND u.org_id IS NOT NULL
HAVING status = 'MISMATCH'
LIMIT 10;
-- 性能测试查询:验证优化效果
-- 优化前的查询(需要JOIN)
EXPLAIN SELECT
u.user_name,
o.name as org_name
FROM sys_user u
LEFT JOIN sys_user_org uo ON u.id = uo.user_id AND uo.is_deleted = 0
LEFT JOIN sys_org_info o ON uo.org_id = o.id AND o.is_deleted = 0
WHERE u.customer_id = 1939964806110937090 AND u.is_deleted = 0;
-- 优化后的查询(单表查询)
EXPLAIN SELECT
u.user_name,
u.org_name
FROM sys_user u
WHERE u.customer_id = 1939964806110937090 AND u.is_deleted = 0;