-- Keep AIHR tenant identifiers compatible with the framework tenant contract. -- This migration derives the target charset/collation from sys_oss.tenant_id, -- preserves each AIHR tenant_id column's nullability/default/comment, and is idempotent. DROP PROCEDURE IF EXISTS aihr_align_tenant_collation; DELIMITER $$ CREATE PROCEDURE aihr_align_tenant_collation() BEGIN DECLARE done int DEFAULT 0; DECLARE target_charset varchar(64); DECLARE target_collation varchar(64); DECLARE current_table varchar(64); DECLARE current_type text; DECLARE current_nullable varchar(3); DECLARE current_default text; DECLARE current_comment text; DECLARE tenant_columns CURSOR FOR SELECT table_name, column_type, is_nullable, column_default, column_comment FROM information_schema.columns WHERE table_schema = DATABASE() AND LEFT(table_name, 5) = 'aihr_' AND column_name = 'tenant_id' AND collation_name <> target_collation ORDER BY table_name; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; SELECT character_set_name, collation_name INTO target_charset, target_collation FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'sys_oss' AND column_name = 'tenant_id' LIMIT 1; IF target_charset IS NULL OR target_collation IS NULL THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'sys_oss.tenant_id charset/collation contract is missing'; END IF; OPEN tenant_columns; align_loop: LOOP FETCH tenant_columns INTO current_table, current_type, current_nullable, current_default, current_comment; IF done = 1 THEN LEAVE align_loop; END IF; SET @aihr_tenant_ddl = CONCAT( 'ALTER TABLE `', REPLACE(current_table, '`', '``'), '` MODIFY COLUMN `tenant_id` ', current_type, ' CHARACTER SET `', REPLACE(target_charset, '`', '``'), '` COLLATE `', REPLACE(target_collation, '`', '``'), '`', IF(current_nullable = 'YES', ' NULL', ' NOT NULL'), IF(current_default IS NULL, '', CONCAT(' DEFAULT ', QUOTE(current_default))), ' COMMENT ', QUOTE(COALESCE(current_comment, '')) ); PREPARE aihr_tenant_statement FROM @aihr_tenant_ddl; EXECUTE aihr_tenant_statement; DEALLOCATE PREPARE aihr_tenant_statement; END LOOP; CLOSE tenant_columns; END$$ DELIMITER ; CALL aihr_align_tenant_collation(); DROP PROCEDURE aihr_align_tenant_collation;