fix(release): enforce AIHR tenant collation contract
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
-- 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;
|
||||
Reference in New Issue
Block a user