Files
prop-ai-hr/backend/script/sql/update/aihr_20260715_tenant_collation_mysql8.sql
T

71 lines
2.4 KiB
SQL

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