feat: 完善数据中枢联邦查询闭环

- 重构数据源生命周期、元数据纳管与运行时切换

- 增加只读 SQL、查询审计、跨节点取消与工作流联动

- 完善管理端连接配置、元数据浏览与 SQL 工作台
This commit is contained in:
2026-08-26 18:14:34 +08:00
parent 3e79e99925
commit e38821e48a
113 changed files with 17032 additions and 1151 deletions

View File

@@ -0,0 +1,152 @@
-- XL01 WP1: 数据中枢 Federation SQL 数据契约。
-- 历史数据中枢表继续保留;本迁移只做可回填的增量调整。
ALTER TABLE `tb_datacenter_source`
ADD COLUMN `adapter_id` varchar(64) NULL COMMENT 'Federation Adapter 标识' AFTER `source_type`,
ADD COLUMN `adapter_options_json` text NULL COMMENT '不含凭据的 Adapter 选项' AFTER `adapter_id`,
ADD COLUMN `definition_revision` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '数据源 Definition 版本' AFTER `adapter_options_json`,
ADD COLUMN `definition_checksum` char(64) NULL COMMENT 'Definition SHA-256 校验和' AFTER `definition_revision`,
ADD COLUMN `scope_revision` bigint UNSIGNED NOT NULL DEFAULT 1 COMMENT '纳管范围版本' AFTER `definition_checksum`,
ADD COLUMN `compatibility_status` varchar(32) NULL COMMENT 'Adapter 兼容状态' AFTER `scope_revision`,
ADD COLUMN `database_product_name` varchar(128) NULL COMMENT '数据库产品名称' AFTER `compatibility_status`,
ADD COLUMN `database_product_version` varchar(128) NULL COMMENT '数据库产品版本' AFTER `database_product_name`,
ADD COLUMN `driver_name` varchar(128) NULL COMMENT 'JDBC Driver 名称' AFTER `database_product_version`,
ADD COLUMN `driver_version` varchar(128) NULL COMMENT 'JDBC Driver 版本' AFTER `driver_name`,
ADD COLUMN `metadata_refresh_status` varchar(32) NULL COMMENT '元数据刷新状态' AFTER `driver_version`,
ADD COLUMN `metadata_refreshed_at` datetime NULL COMMENT '元数据最近刷新时间' AFTER `metadata_refresh_status`;
UPDATE `tb_datacenter_source`
SET `adapter_id` = CASE
WHEN `source_type` IN ('MYSQL', 'POSTGRESQL') THEN 'jdbc'
ELSE `adapter_id`
END,
`definition_revision` = CASE
WHEN `source_type` = 'PROJECT_MYSQL' THEN 1
ELSE `definition_revision`
END,
`status` = CASE
WHEN `source_type` = 'PROJECT_MYSQL' THEN 1
ELSE `status`
END,
`metadata_refresh_status` = COALESCE(`metadata_refresh_status`, 'PENDING');
ALTER TABLE `tb_datacenter_source`
ADD UNIQUE KEY `uk_datacenter_source_tenant_code` (`tenant_id`, `source_code`),
ADD KEY `idx_datacenter_source_runtime` (`status`, `definition_revision`);
ALTER TABLE `tb_datacenter_catalog`
ADD COLUMN `logical_schema_name` varchar(128) NULL COMMENT 'Calcite 逻辑 Schema' AFTER `catalog_type`,
ADD COLUMN `physical_catalog_name` varchar(128) NULL COMMENT 'JDBC 物理 Catalog' AFTER `logical_schema_name`,
ADD COLUMN `physical_schema_name` varchar(128) NULL COMMENT 'JDBC 物理 Schema' AFTER `physical_catalog_name`,
ADD COLUMN `namespace_key` char(64) NULL COMMENT '物理命名空间稳定摘要' AFTER `physical_schema_name`,
ADD COLUMN `metadata_status` varchar(32) NOT NULL DEFAULT 'ACTIVE' COMMENT '元数据状态' AFTER `namespace_key`,
ADD COLUMN `last_seen_at` datetime NULL COMMENT '最近发现时间' AFTER `metadata_status`;
UPDATE `tb_datacenter_catalog`
SET `logical_schema_name` = `catalog_name`,
`physical_catalog_name` = `catalog_name`,
`namespace_key` = SHA2(CONCAT(
'C', CHAR_LENGTH(`catalog_name`), ':', `catalog_name`,
'S', '-1:'
), 256),
`last_seen_at` = COALESCE(`modified`, `created`)
WHERE `logical_schema_name` IS NULL OR `namespace_key` IS NULL;
ALTER TABLE `tb_datacenter_catalog`
MODIFY COLUMN `logical_schema_name` varchar(128) NOT NULL COMMENT 'Calcite 逻辑 Schema',
MODIFY COLUMN `namespace_key` char(64) NOT NULL COMMENT '物理命名空间稳定摘要',
ADD UNIQUE KEY `uk_datacenter_catalog_logical_schema` (`source_id`, `logical_schema_name`),
ADD UNIQUE KEY `uk_datacenter_catalog_namespace` (`source_id`, `namespace_key`);
ALTER TABLE `tb_datacenter_table`
MODIFY COLUMN `table_name` varchar(128) NOT NULL COMMENT '数据表名',
ADD COLUMN `physical_identity_key` char(64) NULL COMMENT '物理对象稳定摘要' AFTER `actual_table`,
ADD COLUMN `metadata_fingerprint` char(64) NULL COMMENT '表结构摘要' AFTER `physical_identity_key`,
ADD COLUMN `metadata_status` varchar(32) NOT NULL DEFAULT 'ACTIVE' COMMENT '元数据状态' AFTER `metadata_fingerprint`,
ADD COLUMN `last_seen_at` datetime NULL COMMENT '最近发现时间' AFTER `metadata_status`,
ADD COLUMN `queryable` tinyint NOT NULL DEFAULT 1 COMMENT '是否允许统一只读查询' AFTER `last_seen_at`,
ADD COLUMN `time_semantics` varchar(32) NOT NULL DEFAULT 'NONE' COMMENT '时间语义' AFTER `queryable`,
ADD COLUMN `default_time_field_id` bigint UNSIGNED NULL COMMENT '默认时间字段 ID' AFTER `time_semantics`,
ADD COLUMN `metadata_revision` bigint UNSIGNED NOT NULL DEFAULT 1 COMMENT '表元数据版本' AFTER `default_time_field_id`;
UPDATE `tb_datacenter_table`
SET `actual_table` = COALESCE(NULLIF(`actual_table`, ''), `table_name`),
`physical_identity_key` = SHA2(CONCAT(
'S', CHAR_LENGTH(CAST(COALESCE(`source_id`, 0) AS CHAR)), ':', COALESCE(`source_id`, 0),
'C', CHAR_LENGTH(CAST(COALESCE(`catalog_id`, 0) AS CHAR)), ':', COALESCE(`catalog_id`, 0),
'T', CHAR_LENGTH(COALESCE(NULLIF(`actual_table`, ''), `table_name`)), ':', COALESCE(NULLIF(`actual_table`, ''), `table_name`),
'K', CHAR_LENGTH(`table_kind`), ':', `table_kind`
), 256),
`metadata_fingerprint` = SHA2(CONCAT(
CHAR_LENGTH(`table_name`), ':', `table_name`,
CHAR_LENGTH(`table_kind`), ':', `table_kind`
), 256),
`last_seen_at` = COALESCE(`modified`, `created`)
WHERE `physical_identity_key` IS NULL OR `metadata_fingerprint` IS NULL;
ALTER TABLE `tb_datacenter_table`
MODIFY COLUMN `physical_identity_key` char(64) NOT NULL COMMENT '物理对象稳定摘要',
ADD UNIQUE KEY `uk_datacenter_table_physical_identity` (`physical_identity_key`),
ADD KEY `idx_datacenter_table_metadata` (`source_id`, `catalog_id`, `metadata_status`);
ALTER TABLE `tb_datacenter_table_field`
MODIFY COLUMN `field_name` varchar(128) NOT NULL COMMENT '字段名称',
ADD COLUMN `ordinal_position` int NULL COMMENT 'JDBC 字段顺序' AFTER `source_column_name`,
ADD COLUMN `jdbc_type_code` int NULL COMMENT 'java.sql.Types 数值' AFTER `jdbc_type`,
ADD COLUMN `native_type_name` varchar(128) NULL COMMENT '数据库原生类型名' AFTER `jdbc_type_code`,
ADD COLUMN `metadata_fingerprint` char(64) NULL COMMENT '字段元数据摘要' AFTER `scale`,
ADD COLUMN `metadata_status` varchar(32) NOT NULL DEFAULT 'ACTIVE' COMMENT '元数据状态' AFTER `metadata_fingerprint`,
ADD COLUMN `last_seen_at` datetime NULL COMMENT '最近发现时间' AFTER `metadata_status`,
ADD COLUMN `sensitivity_level` varchar(32) NOT NULL DEFAULT 'PUBLIC' COMMENT '敏感级别' AFTER `last_seen_at`,
ADD COLUMN `masking_strategy` varchar(32) NULL COMMENT '脱敏策略' AFTER `sensitivity_level`;
UPDATE `tb_datacenter_table_field`
SET `source_column_name` = COALESCE(NULLIF(`source_column_name`, ''), `field_name`),
`native_type_name` = COALESCE(`native_type_name`, `jdbc_type`),
`metadata_fingerprint` = SHA2(CONCAT(
CHAR_LENGTH(`field_name`), ':', `field_name`,
CHAR_LENGTH(COALESCE(`jdbc_type`, '')), ':', COALESCE(`jdbc_type`, ''),
'P', COALESCE(`precision`, -1), ':S', COALESCE(`scale`, -1), ':R', `required`
), 256),
`last_seen_at` = COALESCE(`modified`, `created`),
`writable` = CASE WHEN `writable` IS NULL THEN 0 ELSE `writable` END
WHERE `metadata_fingerprint` IS NULL OR `source_column_name` IS NULL;
ALTER TABLE `tb_datacenter_table_field`
MODIFY COLUMN `source_column_name` varchar(128) NOT NULL COMMENT '源字段名',
MODIFY COLUMN `metadata_fingerprint` char(64) NOT NULL COMMENT '字段元数据摘要',
ADD UNIQUE KEY `uk_datacenter_field_source_column` (`table_id`, `source_column_name`),
ADD KEY `idx_datacenter_field_metadata` (`table_id`, `metadata_status`, `ordinal_position`);
CREATE TABLE `tb_datacenter_query_audit`
(
`id` bigint UNSIGNED NOT NULL COMMENT '主键',
`query_id` varchar(64) NOT NULL COMMENT '查询标识',
`tenant_id` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '租户ID',
`dept_id` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '部门ID',
`caller_type` varchar(32) NOT NULL COMMENT '调用方类型',
`caller_id` varchar(128) NULL COMMENT '调用方标识',
`source_id` bigint UNSIGNED NOT NULL COMMENT '数据源ID',
`source_revision` bigint UNSIGNED NOT NULL COMMENT '数据源版本',
`scope_revision` bigint UNSIGNED NOT NULL COMMENT '纳管范围版本',
`referenced_tables_json` text NULL COMMENT '引用表摘要',
`referenced_fields_json` text NULL COMMENT '引用字段摘要',
`parameterized_sql` longtext NOT NULL COMMENT '参数化或脱敏 SQL',
`masked_parameters_json` text NULL COMMENT '脱敏参数摘要',
`status` varchar(32) NOT NULL COMMENT '执行状态',
`error_code` varchar(64) NULL COMMENT '稳定错误码',
`error_message` varchar(500) NULL COMMENT '有界错误说明',
`started_at` datetime NOT NULL COMMENT '开始时间',
`finished_at` datetime NULL COMMENT '结束时间',
`duration_ms` bigint NULL COMMENT '总耗时毫秒',
`database_duration_ms` bigint NULL COMMENT '数据库耗时毫秒',
`returned_rows` bigint NOT NULL DEFAULT 0 COMMENT '返回行数',
`truncated` tinyint NOT NULL DEFAULT 0 COMMENT '是否截断',
`created` datetime NOT NULL COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_datacenter_query_audit_query_id` (`query_id`),
KEY `idx_datacenter_query_audit_tenant_created` (`tenant_id`, `created`),
KEY `idx_datacenter_query_audit_source_created` (`source_id`, `created`),
KEY `idx_datacenter_query_audit_caller_created` (`caller_type`, `caller_id`, `created`),
KEY `idx_datacenter_query_audit_status_created` (`status`, `created`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '数据中枢统一查询审计';

View File

@@ -0,0 +1,19 @@
ALTER TABLE `tb_datacenter_catalog`
MODIFY COLUMN `catalog_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '目录名称',
MODIFY COLUMN `logical_schema_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'Calcite逻辑Schema',
MODIFY COLUMN `physical_catalog_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT '物理Catalog',
MODIFY COLUMN `physical_schema_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT '物理Schema';
ALTER TABLE `tb_datacenter_table`
MODIFY COLUMN `table_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '数据表名',
MODIFY COLUMN `actual_table` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT '物理表名';
ALTER TABLE `tb_datacenter_table_field`
MODIFY COLUMN `field_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '字段名称',
MODIFY COLUMN `source_column_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '源字段名';
UPDATE `tb_datacenter_table_field` field_meta
JOIN `tb_datacenter_table` table_meta ON table_meta.`id` = field_meta.`table_id`
JOIN `tb_datacenter_source` source_meta ON source_meta.`id` = table_meta.`source_id`
SET field_meta.`writable` = 0
WHERE source_meta.`source_type` IN ('MYSQL', 'POSTGRESQL');

View File

@@ -0,0 +1,4 @@
ALTER TABLE `tb_datacenter_query_audit`
ADD COLUMN `executor_account_id` bigint UNSIGNED NULL COMMENT '执行账号ID' AFTER `dept_id`,
ADD KEY `idx_datacenter_query_audit_executor_created`
(`tenant_id`, `executor_account_id`, `created`);