-- 仅用于本地环境:为 IM 业务表补充 tenant_id 字段。 -- -- 本脚本只修改表结构并回填现有数据,不修改索引、唯一约束或应用代码, -- 也不会启用多商户共库能力。 USE `tinode`; DELIMITER $$ DROP PROCEDURE IF EXISTS add_im_tenant_columns$$ CREATE PROCEDURE add_im_tenant_columns(IN target_schema VARCHAR(64), IN default_tenant_id BIGINT) BEGIN DECLARE done INT DEFAULT 0; DECLARE target_table VARCHAR(128); DECLARE has_id INT DEFAULT 0; DECLARE table_cursor CURSOR FOR SELECT t.table_name FROM information_schema.tables t WHERE t.table_schema = target_schema AND t.table_type = 'BASE TABLE' AND t.table_name LIKE 'im\_%' AND NOT EXISTS ( SELECT 1 FROM information_schema.columns c WHERE c.table_schema = t.table_schema AND c.table_name = t.table_name AND c.column_name = 'tenant_id' ); DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; OPEN table_cursor; table_loop: LOOP FETCH table_cursor INTO target_table; IF done = 1 THEN LEAVE table_loop; END IF; SELECT COUNT(*) INTO has_id FROM information_schema.columns WHERE table_schema = target_schema AND table_name = target_table AND column_name = 'id'; SET @position_sql = IF(has_id > 0, ' AFTER `id`', ' FIRST'); SET @alter_sql = CONCAT( 'ALTER TABLE `', target_schema, '`.`', target_table, '` ADD COLUMN `tenant_id` BIGINT NOT NULL DEFAULT ', default_tenant_id, ' COMMENT ''租户ID''', @position_sql ); PREPARE alter_stmt FROM @alter_sql; EXECUTE alter_stmt; DEALLOCATE PREPARE alter_stmt; END LOOP; CLOSE table_cursor; END$$ DELIMITER ; -- 本地默认业务库,现有数据归属 tenant_id=1。 CALL add_im_tenant_columns('tinode', 1); -- 本地独立业务库,现有数据归属 tenant_id=2。 CALL add_im_tenant_columns('meeting_im', 2); DROP PROCEDURE IF EXISTS add_im_tenant_columns; -- 验证:以下结果中 missing_count 应全部为 0。 SELECT 'tinode' AS db_name, COUNT(*) AS missing_count FROM information_schema.tables t WHERE t.table_schema = 'tinode' AND t.table_type = 'BASE TABLE' AND t.table_name LIKE 'im\_%' AND NOT EXISTS ( SELECT 1 FROM information_schema.columns c WHERE c.table_schema = t.table_schema AND c.table_name = t.table_name AND c.column_name = 'tenant_id' ) UNION ALL SELECT 'meeting_im', COUNT(*) FROM information_schema.tables t WHERE t.table_schema = 'meeting_im' AND t.table_type = 'BASE TABLE' AND t.table_name LIKE 'im\_%' AND NOT EXISTS ( SELECT 1 FROM information_schema.columns c WHERE c.table_schema = t.table_schema AND c.table_name = t.table_name AND c.column_name = 'tenant_id' );