feat: 重构数据中枢工作台与接入管理

- 新增统一的数据源、目录、纳管表与 Excel 处理后端能力

- 重建管理端数据中枢工作台并替换旧表管理页面

- 补充数据中枢迁移脚本、连接器底座与说明字段支持
This commit is contained in:
2026-04-02 18:55:31 +08:00
parent b6213d0933
commit 798effbd5b
117 changed files with 9739 additions and 1824 deletions

View File

@@ -0,0 +1,202 @@
CREATE TABLE `tb_datacenter_source`
(
`id` bigint UNSIGNED NOT NULL COMMENT '主键',
`dept_id` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '部门ID',
`tenant_id` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '租户ID',
`source_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '数据源名称',
`source_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '数据源编码',
`source_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '数据源类型',
`access_mode` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'READ_ONLY' COMMENT '访问模式',
`builtin_flag` int NOT NULL DEFAULT 0 COMMENT '是否内置',
`driver_class_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '驱动类名',
`jdbc_url` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'JDBC URL',
`host` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '主机',
`port` int NULL DEFAULT NULL COMMENT '端口',
`database_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '数据库名',
`schema_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'Schema名',
`username` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '用户名',
`credential_cipher` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '凭据密文',
`config_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '连接配置',
`capabilities_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '能力声明',
`last_test_status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '最近测试状态',
`last_test_message` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '最近测试信息',
`last_tested_at` datetime NULL DEFAULT NULL COMMENT '最近测试时间',
`status` int NOT NULL DEFAULT 0 COMMENT '状态',
`options` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '扩展项',
`created` datetime NOT NULL COMMENT '创建时间',
`created_by` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
`modified` datetime NOT NULL COMMENT '修改时间',
`modified_by` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '修改人',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_datacenter_source_tenant_type` (`tenant_id`, `source_type`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '数据中心数据源' ROW_FORMAT = DYNAMIC;
CREATE TABLE `tb_datacenter_catalog`
(
`id` bigint UNSIGNED NOT NULL COMMENT '主键',
`dept_id` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '部门ID',
`tenant_id` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '租户ID',
`source_id` bigint UNSIGNED NOT NULL COMMENT '数据源ID',
`catalog_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '目录名',
`catalog_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '目录描述',
`catalog_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'DATABASE' COMMENT '目录类型',
`status` int NOT NULL DEFAULT 0 COMMENT '状态',
`options` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '扩展项',
`created` datetime NOT NULL COMMENT '创建时间',
`created_by` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
`modified` datetime NOT NULL COMMENT '修改时间',
`modified_by` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '修改人',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_datacenter_catalog_source` (`source_id`, `catalog_name`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '数据中心逻辑库/命名空间' ROW_FORMAT = DYNAMIC;
ALTER TABLE `tb_datacenter_table`
ADD COLUMN `source_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '数据源ID' AFTER `tenant_id`,
ADD COLUMN `catalog_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '目录ID' AFTER `source_id`,
ADD COLUMN `table_kind` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'LOCAL_DYNAMIC' COMMENT '表类型' AFTER `actual_table`,
ADD COLUMN `access_mode` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'READ_WRITE' COMMENT '访问模式' AFTER `table_kind`,
ADD COLUMN `materialized_table` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '物化表名' AFTER `access_mode`,
ADD COLUMN `versioning_enabled` int NOT NULL DEFAULT 0 COMMENT '是否开启版本' AFTER `materialized_table`,
ADD COLUMN `capabilities_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '能力声明' AFTER `options`;
ALTER TABLE `tb_datacenter_table_field`
ADD COLUMN `source_column_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '源字段名' AFTER `field_name`,
ADD COLUMN `jdbc_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'JDBC类型' AFTER `field_type`,
ADD COLUMN `precision` int NULL DEFAULT NULL COMMENT '精度' AFTER `jdbc_type`,
ADD COLUMN `scale` int NULL DEFAULT NULL COMMENT '小数位' AFTER `precision`,
ADD COLUMN `queryable` int NOT NULL DEFAULT 1 COMMENT '可查询' AFTER `required`,
ADD COLUMN `sortable` int NOT NULL DEFAULT 1 COMMENT '可排序' AFTER `queryable`,
ADD COLUMN `writable` int NOT NULL DEFAULT 1 COMMENT '可写入' AFTER `sortable`,
ADD COLUMN `indexed` int NOT NULL DEFAULT 0 COMMENT '是否索引' AFTER `writable`;
CREATE TABLE `tb_datacenter_dataset_version`
(
`id` bigint UNSIGNED NOT NULL COMMENT '主键',
`dept_id` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '部门ID',
`tenant_id` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '租户ID',
`table_id` bigint UNSIGNED NOT NULL COMMENT '表ID',
`version_no` int NOT NULL DEFAULT 1 COMMENT '版本号',
`version_label` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '版本标签',
`materialized_table` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '物化表名',
`snapshot_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '版本快照',
`status` int NOT NULL DEFAULT 0 COMMENT '状态',
`created` datetime NOT NULL COMMENT '创建时间',
`created_by` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
`modified` datetime NOT NULL COMMENT '修改时间',
`modified_by` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '修改人',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_dataset_version_table` (`table_id`, `version_no`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '数据集版本' ROW_FORMAT = DYNAMIC;
CREATE TABLE `tb_datacenter_import_job`
(
`id` bigint UNSIGNED NOT NULL COMMENT '主键',
`dept_id` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '部门ID',
`tenant_id` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '租户ID',
`source_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '数据源ID',
`catalog_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '目录ID',
`table_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '表ID',
`job_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '任务类型',
`file_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '文件名',
`storage_path` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '文件存储路径',
`status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '任务状态',
`total_rows` bigint NULL DEFAULT NULL COMMENT '总行数',
`success_rows` bigint NULL DEFAULT NULL COMMENT '成功行数',
`error_rows` bigint NULL DEFAULT NULL COMMENT '失败行数',
`error_summary` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '错误摘要',
`payload_json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '任务载荷',
`started_at` datetime NULL DEFAULT NULL COMMENT '开始时间',
`finished_at` datetime NULL DEFAULT NULL COMMENT '结束时间',
`created` datetime NOT NULL COMMENT '创建时间',
`created_by` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
`modified` datetime NOT NULL COMMENT '修改时间',
`modified_by` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '修改人',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_import_job_source` (`source_id`, `status`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '数据中心导入任务' ROW_FORMAT = DYNAMIC;
CREATE TABLE `tb_datacenter_derived_table`
(
`id` bigint UNSIGNED NOT NULL COMMENT '主键',
`dept_id` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '部门ID',
`tenant_id` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '租户ID',
`source_table_id` bigint UNSIGNED NOT NULL COMMENT '源表ID',
`derived_table_id` bigint UNSIGNED NOT NULL COMMENT '派生表ID',
`derive_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '派生类型',
`derive_config_json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '派生配置',
`status` int NOT NULL DEFAULT 0 COMMENT '状态',
`created` datetime NOT NULL COMMENT '创建时间',
`created_by` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
`modified` datetime NOT NULL COMMENT '修改时间',
`modified_by` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '修改人',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_derived_table_source` (`source_table_id`, `derived_table_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '数据中心派生表关系' ROW_FORMAT = DYNAMIC;
INSERT INTO `tb_datacenter_source` (`id`, `dept_id`, `tenant_id`, `source_name`, `source_code`, `source_type`, `access_mode`, `builtin_flag`, `status`, `config_json`, `capabilities_json`, `created`, `created_by`, `modified`, `modified_by`)
SELECT DISTINCT
9000000000000000000 + `tenant_id`,
COALESCE(MIN(`dept_id`), 0),
`tenant_id`,
'本地动态表',
CONCAT('LOCAL_DYNAMIC_', `tenant_id`),
'LOCAL_DYNAMIC',
'READ_WRITE',
1,
0,
JSON_OBJECT('builtin', true),
JSON_OBJECT('capabilities', JSON_ARRAY('TEST_CONNECTION', 'BROWSE_METADATA', 'READ_QUERY', 'WRITE_MUTATION', 'MATERIALIZE')),
NOW(),
0,
NOW(),
0
FROM `tb_datacenter_table`
GROUP BY `tenant_id`;
INSERT INTO `tb_datacenter_catalog` (`id`, `dept_id`, `tenant_id`, `source_id`, `catalog_name`, `catalog_desc`, `catalog_type`, `status`, `created`, `created_by`, `modified`, `modified_by`)
SELECT DISTINCT
9000000000001000000 + `tenant_id`,
COALESCE(MIN(`dept_id`), 0),
`tenant_id`,
9000000000000000000 + `tenant_id`,
'local_dynamic',
'本地动态表目录',
'DATABASE',
0,
NOW(),
0,
NOW(),
0
FROM `tb_datacenter_table`
GROUP BY `tenant_id`;
INSERT INTO `tb_datacenter_source` (`id`, `dept_id`, `tenant_id`, `source_name`, `source_code`, `source_type`, `access_mode`, `builtin_flag`, `status`, `config_json`, `capabilities_json`, `created`, `created_by`, `modified`, `modified_by`)
SELECT 9000000000000000000, 0, 0, '本地动态表', 'LOCAL_DYNAMIC_0', 'LOCAL_DYNAMIC', 'READ_WRITE', 1, 0,
JSON_OBJECT('builtin', true),
JSON_OBJECT('capabilities', JSON_ARRAY('TEST_CONNECTION', 'BROWSE_METADATA', 'READ_QUERY', 'WRITE_MUTATION', 'MATERIALIZE')),
NOW(), 0, NOW(), 0
FROM dual
WHERE NOT EXISTS (SELECT 1 FROM `tb_datacenter_source` WHERE `id` = 9000000000000000000);
INSERT INTO `tb_datacenter_catalog` (`id`, `dept_id`, `tenant_id`, `source_id`, `catalog_name`, `catalog_desc`, `catalog_type`, `status`, `created`, `created_by`, `modified`, `modified_by`)
SELECT 9000000000001000000, 0, 0, 9000000000000000000, 'local_dynamic', '本地动态表目录', 'DATABASE', 0, NOW(), 0, NOW(), 0
FROM dual
WHERE NOT EXISTS (SELECT 1 FROM `tb_datacenter_catalog` WHERE `id` = 9000000000001000000);
UPDATE `tb_datacenter_table`
SET `source_id` = 9000000000000000000 + `tenant_id`,
`catalog_id` = 9000000000001000000 + `tenant_id`,
`table_kind` = 'LOCAL_DYNAMIC',
`access_mode` = 'READ_WRITE',
`materialized_table` = `actual_table`,
`versioning_enabled` = 0,
`capabilities_json` = JSON_OBJECT('capabilities', JSON_ARRAY('READ_QUERY', 'WRITE_MUTATION'))
WHERE `source_id` IS NULL;
UPDATE `tb_datacenter_table_field`
SET `source_column_name` = `field_name`,
`queryable` = 1,
`sortable` = 1,
`writable` = 1,
`indexed` = 0
WHERE `source_column_name` IS NULL;

View File

@@ -0,0 +1,86 @@
SET NAMES utf8mb4;
UPDATE `tb_sys_menu`
SET
`menu_url` = '/datacenter',
`component` = '',
`remark` = '数据中心统一数据接入平台'
WHERE `id` = 300817858217091072;
INSERT INTO `tb_sys_menu` (
`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`,
`menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`,
`created`, `created_by`, `modified`, `modified_by`, `remark`
)
SELECT
366300000000000001, 300817858217091072, 0, 'menus.ai.datacenterDataset',
'/datacenter/dataset', '/datacenter/DatacenterDatasetManage',
'svg:data-center', 1, '', 10, 0,
NOW(), 1, NOW(), 1, '数据中心-数据集管理'
WHERE NOT EXISTS (
SELECT 1 FROM `tb_sys_menu` WHERE `id` = 366300000000000001
);
INSERT INTO `tb_sys_menu` (
`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`,
`menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`,
`created`, `created_by`, `modified`, `modified_by`, `remark`
)
SELECT
366300000000000002, 300817858217091072, 0, 'menus.ai.datacenterSource',
'/datacenter/source', '/datacenter/DatacenterSourceAccess',
'svg:data-center', 1, '', 20, 0,
NOW(), 1, NOW(), 1, '数据中心-数据源接入'
WHERE NOT EXISTS (
SELECT 1 FROM `tb_sys_menu` WHERE `id` = 366300000000000002
);
INSERT INTO `tb_sys_menu` (
`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`,
`menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`,
`created`, `created_by`, `modified`, `modified_by`, `remark`
)
SELECT
366300000000000003, 366300000000000002, 1, '查询',
'', '', '', 0, '/api/v1/datacenterSource/query', 1, 0,
NOW(), 1, NOW(), 1, '数据源接入-查询'
WHERE NOT EXISTS (
SELECT 1 FROM `tb_sys_menu` WHERE `id` = 366300000000000003
);
INSERT INTO `tb_sys_menu` (
`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`,
`menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`,
`created`, `created_by`, `modified`, `modified_by`, `remark`
)
SELECT
366300000000000004, 366300000000000002, 1, '保存',
'', '', '', 0, '/api/v1/datacenterSource/save', 2, 0,
NOW(), 1, NOW(), 1, '数据源接入-保存'
WHERE NOT EXISTS (
SELECT 1 FROM `tb_sys_menu` WHERE `id` = 366300000000000004
);
INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`)
SELECT 366300000000000101, 1, 366300000000000001
WHERE NOT EXISTS (
SELECT 1 FROM `tb_sys_role_menu` WHERE `id` = 366300000000000101
);
INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`)
SELECT 366300000000000102, 1, 366300000000000002
WHERE NOT EXISTS (
SELECT 1 FROM `tb_sys_role_menu` WHERE `id` = 366300000000000102
);
INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`)
SELECT 366300000000000103, 1, 366300000000000003
WHERE NOT EXISTS (
SELECT 1 FROM `tb_sys_role_menu` WHERE `id` = 366300000000000103
);
INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`)
SELECT 366300000000000104, 1, 366300000000000004
WHERE NOT EXISTS (
SELECT 1 FROM `tb_sys_role_menu` WHERE `id` = 366300000000000104
);

View File

@@ -0,0 +1,20 @@
SET NAMES utf8mb4;
DELETE FROM `tb_sys_role_menu`
WHERE `menu_id` IN (
300818298270883840,
300818387710222336,
300818488214134784
);
DELETE FROM `tb_sys_menu`
WHERE `id` IN (
300818298270883840,
300818387710222336,
300818488214134784
)
OR `permission_tag` IN (
'/api/v1/datacenterTable/query',
'/api/v1/datacenterTable/save',
'/api/v1/datacenterTable/remove'
);

View File

@@ -0,0 +1,101 @@
INSERT INTO `tb_datacenter_source` (
`id`, `dept_id`, `tenant_id`, `source_name`, `source_code`, `source_type`, `access_mode`,
`builtin_flag`, `status`, `config_json`, `capabilities_json`, `created`, `created_by`, `modified`, `modified_by`
)
SELECT
9000000000002000000 + t.tenant_id,
t.dept_id,
t.tenant_id,
'项目 MySQL',
CONCAT('PROJECT_MYSQL_', t.tenant_id),
'PROJECT_MYSQL',
'READ_WRITE',
1,
0,
JSON_OBJECT('builtin', true),
JSON_OBJECT('capabilities', JSON_ARRAY('TEST_CONNECTION', 'BROWSE_METADATA', 'READ_QUERY', 'WRITE_MUTATION')),
NOW(),
0,
NOW(),
0
FROM (
SELECT tenant_id, COALESCE(MIN(dept_id), 0) AS dept_id
FROM (
SELECT `tenant_id`, `dept_id`
FROM `tb_datacenter_source`
WHERE `source_type` = 'LOCAL_DYNAMIC'
UNION ALL
SELECT `tenant_id`, `dept_id`
FROM `tb_datacenter_table`
WHERE `table_kind` = 'LOCAL_DYNAMIC'
OR `source_id` IN (
SELECT `id` FROM `tb_datacenter_source` WHERE `source_type` = 'LOCAL_DYNAMIC'
)
) tenant_scope
GROUP BY tenant_id
) t
WHERE NOT EXISTS (
SELECT 1 FROM `tb_datacenter_source` s WHERE s.`id` = 9000000000002000000 + t.tenant_id
);
INSERT INTO `tb_datacenter_catalog` (
`id`, `dept_id`, `tenant_id`, `source_id`, `catalog_name`, `catalog_desc`, `catalog_type`,
`status`, `created`, `created_by`, `modified`, `modified_by`
)
SELECT
9000000000003000000 + t.tenant_id,
t.dept_id,
t.tenant_id,
9000000000002000000 + t.tenant_id,
'project_mysql',
'项目 MySQL',
'DATABASE',
0,
NOW(),
0,
NOW(),
0
FROM (
SELECT tenant_id, COALESCE(MIN(dept_id), 0) AS dept_id
FROM (
SELECT `tenant_id`, `dept_id`
FROM `tb_datacenter_source`
WHERE `source_type` = 'LOCAL_DYNAMIC'
UNION ALL
SELECT `tenant_id`, `dept_id`
FROM `tb_datacenter_table`
WHERE `table_kind` = 'LOCAL_DYNAMIC'
OR `source_id` IN (
SELECT `id` FROM `tb_datacenter_source` WHERE `source_type` = 'LOCAL_DYNAMIC'
)
) tenant_scope
GROUP BY tenant_id
) t
WHERE NOT EXISTS (
SELECT 1 FROM `tb_datacenter_catalog` c WHERE c.`id` = 9000000000003000000 + t.tenant_id
);
UPDATE `tb_datacenter_table`
SET `source_id` = 9000000000002000000 + `tenant_id`,
`catalog_id` = 9000000000003000000 + `tenant_id`,
`table_kind` = 'PROJECT_MANAGED',
`access_mode` = 'READ_WRITE',
`materialized_table` = COALESCE(`materialized_table`, `actual_table`),
`versioning_enabled` = COALESCE(`versioning_enabled`, 0),
`capabilities_json` = JSON_OBJECT('capabilities', JSON_ARRAY('READ_QUERY', 'WRITE_MUTATION'))
WHERE `table_kind` = 'LOCAL_DYNAMIC'
OR `source_id` IN (
SELECT `id` FROM `tb_datacenter_source` WHERE `source_type` = 'LOCAL_DYNAMIC'
);
DELETE c
FROM `tb_datacenter_catalog` c
INNER JOIN `tb_datacenter_source` s ON s.`id` = c.`source_id`
WHERE s.`source_type` = 'LOCAL_DYNAMIC';
DELETE FROM `tb_datacenter_source`
WHERE `source_type` = 'LOCAL_DYNAMIC';
ALTER TABLE `tb_datacenter_table`
MODIFY COLUMN `table_kind` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'EXTERNAL_TABLE' COMMENT '表类型',
MODIFY COLUMN `access_mode` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'READ_ONLY' COMMENT '访问模式';