feat: 完善数据中枢联邦查询闭环
- 重构数据源生命周期、元数据纳管与运行时切换 - 增加只读 SQL、查询审计、跨节点取消与工作流联动 - 完善管理端连接配置、元数据浏览与 SQL 工作台
This commit is contained in:
@@ -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 = '数据中枢统一查询审计';
|
||||
@@ -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');
|
||||
@@ -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`);
|
||||
Reference in New Issue
Block a user