-- 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`;