Files
OnboardXAdmin/database/scripts/20260828_reset_onboarding_business_data_v2.sql
T
2026-08-28 17:33:30 +08:00

123 lines
3.7 KiB
SQL

-- OnboardX 入职业务数据重置脚本 V2
-- 自动读取当前数据库实际存在的 ob_ 表,兼容不同版本数据库缺少旧表的情况。
-- 仅保留:ob_variable_definition(合同变量字典)、ob_material_type(上传资料类型)。
-- 不处理 sys_file 表记录及阿里云 OSS 实际对象。
USE `OnboardX`;
DROP PROCEDURE IF EXISTS `ob_reset_business_data`;
DELIMITER $$
CREATE PROCEDURE `ob_reset_business_data`()
BEGIN
DECLARE old_foreign_key_checks INT DEFAULT 1;
DECLARE variable_definition_count_before BIGINT DEFAULT 0;
DECLARE variable_definition_count_after BIGINT DEFAULT 0;
DECLARE material_type_count_before BIGINT DEFAULT 0;
DECLARE material_type_count_after BIGINT DEFAULT 0;
DECLARE finished INT DEFAULT 0;
DECLARE target_table_name VARCHAR(64);
DECLARE business_table_cursor CURSOR FOR
SELECT `TABLE_NAME`
FROM `information_schema`.`TABLES`
WHERE `TABLE_SCHEMA` = DATABASE()
AND `TABLE_TYPE` = 'BASE TABLE'
AND LEFT(`TABLE_NAME`, 3) = 'ob_'
AND `TABLE_NAME` NOT IN (
'ob_variable_definition',
'ob_material_type'
)
ORDER BY `TABLE_NAME`;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
SET FOREIGN_KEY_CHECKS = old_foreign_key_checks;
RESIGNAL;
END;
IF LOWER(DATABASE()) <> 'onboardx' THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '当前数据库不是 OnboardX,已拒绝执行入职业务数据清理';
END IF;
SELECT COUNT(*)
INTO variable_definition_count_before
FROM `ob_variable_definition`;
SELECT COUNT(*)
INTO material_type_count_before
FROM `ob_material_type`;
SET old_foreign_key_checks = @@FOREIGN_KEY_CHECKS;
SET FOREIGN_KEY_CHECKS = 0;
START TRANSACTION;
OPEN business_table_cursor;
delete_loop: LOOP
FETCH business_table_cursor INTO target_table_name;
IF finished = 1 THEN
LEAVE delete_loop;
END IF;
SET @delete_business_table_sql = CONCAT(
'DELETE FROM `',
REPLACE(target_table_name, '`', '``'),
'`'
);
PREPARE delete_business_table_statement FROM @delete_business_table_sql;
EXECUTE delete_business_table_statement;
DEALLOCATE PREPARE delete_business_table_statement;
END LOOP;
CLOSE business_table_cursor;
SELECT COUNT(*)
INTO variable_definition_count_after
FROM `ob_variable_definition`;
SELECT COUNT(*)
INTO material_type_count_after
FROM `ob_material_type`;
IF variable_definition_count_before <> variable_definition_count_after THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '合同变量字典数量发生变化,事务已回滚';
END IF;
IF material_type_count_before <> material_type_count_after THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '上传资料类型数量发生变化,事务已回滚';
END IF;
COMMIT;
SET FOREIGN_KEY_CHECKS = old_foreign_key_checks;
END$$
DELIMITER ;
CALL `ob_reset_business_data`();
DROP PROCEDURE IF EXISTS `ob_reset_business_data`;
-- 校验保留表数据。
SELECT 'ob_variable_definition' AS `PreservedTable`, COUNT(*) AS `RemainingRows`
FROM `ob_variable_definition`
UNION ALL
SELECT 'ob_material_type', COUNT(*)
FROM `ob_material_type`;
-- 查看所有入职业务表;除上面两张保留表外,其余表应为空。
SELECT `TABLE_NAME`, `TABLE_ROWS`
FROM `information_schema`.`TABLES`
WHERE `TABLE_SCHEMA` = DATABASE()
AND LEFT(`TABLE_NAME`, 3) = 'ob_'
ORDER BY `TABLE_NAME`;