93 lines
2.9 KiB
SQL
93 lines
2.9 KiB
SQL
-- 仅用于本地环境:为 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'
|
|
);
|