71 lines
2.4 KiB
SQL
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;
|