-- OnboardX 入职人员与电子签约业务数据清理脚本 -- 适用数据库:MySQL 8.0+ -- -- 会物理删除: -- 1. 正式员工档案; -- 2. 入职任务及候选人填写、材料、审核、合同快照等任务数据; -- 3. 契约锁流程、文档映射、回调及后台预览/盖章事件。 -- -- 会保留: -- 公司、部门、岗位、入职模板、合同模板及版本、模板适用范围、 -- 合同变量字典、模板变量、上传资料类型及其他系统基础配置。 -- -- 特别注意: -- 1. 执行前请先备份数据库;本脚本提交后不可恢复。 -- 2. 请先在契约锁作废仍在签署中的测试流程,或临时关闭回调; -- 本脚本只清理本地数据库,不能删除或作废契约锁平台上的合同。 -- 3. 本脚本不删除 sys_file/dev_file 等系统文件记录,也不删除 OSS 对象, -- 避免误删合同模板源文件或其他模块共用文件。 -- 4. DELETE 会同时清理正常数据和已经软删除的数据。 USE `OnboardX`; SET NAMES utf8mb4; DROP PROCEDURE IF EXISTS `ob_reset_onboarding_personnel_and_sign_data`; DELIMITER $$ CREATE PROCEDURE `ob_reset_onboarding_personnel_and_sign_data`() BEGIN DECLARE old_foreign_key_checks INT DEFAULT 1; DECLARE finished INT DEFAULT 0; DECLARE target_table_name VARCHAR(64); DECLARE before_rows BIGINT DEFAULT 0; DECLARE after_rows BIGINT DEFAULT 0; -- 只允许删除明确列出的流程数据表。新版本即使增加 ob_ 基础表,也不会被误删。 DECLARE target_table_cursor CURSOR FOR SELECT `TABLE_NAME` FROM `information_schema`.`TABLES` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_TYPE` = 'BASE TABLE' AND `TABLE_NAME` IN ( 'ob_electronic_sign_event', 'ob_electronic_sign_document', 'ob_electronic_sign_process', 'ob_task_operation_log', 'ob_task_audit', 'ob_task_material', 'ob_task_form_value', 'ob_task_employee_info', 'ob_task_contract_variable', 'ob_task_contract', 'ob_task_link', 'ob_task_material_requirement', 'ob_task_form_requirement', 'ob_onboarding_task', 'ob_employee' ) ORDER BY FIELD( `TABLE_NAME`, 'ob_electronic_sign_event', 'ob_electronic_sign_document', 'ob_electronic_sign_process', 'ob_task_operation_log', 'ob_task_audit', 'ob_task_material', 'ob_task_form_value', 'ob_task_employee_info', 'ob_task_contract_variable', 'ob_task_contract', 'ob_task_link', 'ob_task_material_requirement', 'ob_task_form_requirement', 'ob_onboarding_task', 'ob_employee' ); 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; DROP TEMPORARY TABLE IF EXISTS `tmp_ob_reset_result`; CREATE TEMPORARY TABLE `tmp_ob_reset_result` ( `TableName` VARCHAR(64) NOT NULL, `BeforeRows` BIGINT NOT NULL, `DeletedRows` BIGINT NOT NULL, `AfterRows` BIGINT NOT NULL, PRIMARY KEY (`TableName`) ); SET old_foreign_key_checks = @@FOREIGN_KEY_CHECKS; SET FOREIGN_KEY_CHECKS = 0; START TRANSACTION; OPEN target_table_cursor; delete_loop: LOOP FETCH target_table_cursor INTO target_table_name; IF finished = 1 THEN LEAVE delete_loop; END IF; SET @ob_reset_row_count = 0; SET @ob_reset_count_sql = CONCAT( 'SELECT COUNT(*) INTO @ob_reset_row_count FROM `', REPLACE(target_table_name, '`', '``'), '`' ); PREPARE ob_reset_count_statement FROM @ob_reset_count_sql; EXECUTE ob_reset_count_statement; DEALLOCATE PREPARE ob_reset_count_statement; SET before_rows = COALESCE(@ob_reset_row_count, 0); SET @ob_reset_delete_sql = CONCAT( 'DELETE FROM `', REPLACE(target_table_name, '`', '``'), '`' ); PREPARE ob_reset_delete_statement FROM @ob_reset_delete_sql; EXECUTE ob_reset_delete_statement; DEALLOCATE PREPARE ob_reset_delete_statement; SET @ob_reset_row_count = 0; PREPARE ob_reset_count_statement FROM @ob_reset_count_sql; EXECUTE ob_reset_count_statement; DEALLOCATE PREPARE ob_reset_count_statement; SET after_rows = COALESCE(@ob_reset_row_count, 0); INSERT INTO `tmp_ob_reset_result` ( `TableName`, `BeforeRows`, `DeletedRows`, `AfterRows` ) VALUES ( target_table_name, before_rows, before_rows - after_rows, after_rows ); END LOOP; CLOSE target_table_cursor; COMMIT; SET FOREIGN_KEY_CHECKS = old_foreign_key_checks; SELECT `TableName` AS `已清理表`, `BeforeRows` AS `清理前`, `DeletedRows` AS `删除数量`, `AfterRows` AS `清理后` FROM `tmp_ob_reset_result` ORDER BY FIELD( `TableName`, 'ob_electronic_sign_event', 'ob_electronic_sign_document', 'ob_electronic_sign_process', 'ob_task_operation_log', 'ob_task_audit', 'ob_task_material', 'ob_task_form_value', 'ob_task_employee_info', 'ob_task_contract_variable', 'ob_task_contract', 'ob_task_link', 'ob_task_material_requirement', 'ob_task_form_requirement', 'ob_onboarding_task', 'ob_employee' ); DROP TEMPORARY TABLE IF EXISTS `tmp_ob_reset_result`; END$$ DELIMITER ; CALL `ob_reset_onboarding_personnel_and_sign_data`(); DROP PROCEDURE IF EXISTS `ob_reset_onboarding_personnel_and_sign_data`; -- 最终校验:下面存在的流程表都应为 0 行。 SELECT `TABLE_NAME` AS `流程数据表`, `TABLE_ROWS` AS `估算剩余行数` FROM `information_schema`.`TABLES` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_TYPE` = 'BASE TABLE' AND `TABLE_NAME` IN ( 'ob_electronic_sign_event', 'ob_electronic_sign_document', 'ob_electronic_sign_process', 'ob_task_operation_log', 'ob_task_audit', 'ob_task_material', 'ob_task_form_value', 'ob_task_employee_info', 'ob_task_contract_variable', 'ob_task_contract', 'ob_task_link', 'ob_task_material_requirement', 'ob_task_form_requirement', 'ob_onboarding_task', 'ob_employee' ) ORDER BY `TABLE_NAME`;