docs(sql): add shared database sharding migrations
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
-- 仅用于本地环境:为 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'
|
||||
);
|
||||
Reference in New Issue
Block a user