Files
im_server/docs/sql/IM-业务表增加租户字段-仅本地.sql
T

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