43 KiB
43 KiB
FMS 新系统核心表结构设计
1. 说明
本文档给出 FMS 新系统核心平台表的 SQL Server 建表语句,范围包括元数据、动态表单、配置版本、Schema 迁移、权限、技术日志、登录日志与业务审计。
约定如下:
- 所有表名以
s_开头,字段名以b_开头。 - 表名、字段名、索引名和约束名统一使用
snake_case。 - 不创建物理外键,关联字段只作为逻辑外键使用。
- 逻辑外键必须创建必要的普通索引或唯一索引。
- 一个租户使用一个独立业务数据库,普通业务表不重复保存
b_tenant_id或b_org_id;集中技术日志和登录日志允许使用b_org_id标识日志来源。 - 内部主键统一使用
bigint identity(1, 1),跨环境标识使用稳定的b_*_key。 - 同库内的逻辑关联 ID(例如
b_form_id、b_release_id)统一使用bigint,不使用uniqueidentifier。 - 业务编号(例如
b_change_set_no、b_release_no)使用bigint,由应用或数据库序列生成,不声明为identity。 - 时间点统一使用
datetime2(3),应用层按 UTC 写入。 - 稳定业务标识统一使用
b_*_key,跨环境导入导出不得依赖内部b_id。 - 扩展内容统一使用
nvarchar(max)普通文本保存,由应用层按业务约定解析和校验,不使用 JSON 字段类型。 - 原布尔语义字段统一使用
tinyint,取值约定为0(否)或1(是)。 - 下面的
b_*_id、b_*_key关联均为逻辑外键,由应用服务负责校验一致性。
本文档只定义平台核心表。海运订舱、集装箱、发票等业务实体表由 Schema Compiler 根据 s_meta_entity、s_meta_field 和 s_meta_relation 生成。
2. 元数据中心
2.1 模块
create table dbo.s_meta_module (
b_id bigint identity(1, 1) not null,
b_module_key nvarchar(128) not null,
b_revision_no int not null,
b_name_key nvarchar(256) not null,
b_description nvarchar(1000) null,
b_origin nvarchar(32) not null
constraint df_s_meta_module_origin default N'platform',
b_enabled tinyint not null
constraint df_s_meta_module_enabled default 1,
b_protected tinyint not null
constraint df_s_meta_module_protected default 0,
b_dependency_text nvarchar(max) null,
b_config_text nvarchar(max) null,
b_created_at datetime2(3) not null
constraint df_s_meta_module_created_at default sysutcdatetime(),
b_created_by nvarchar(128) not null,
constraint pk_s_meta_module primary key (b_id),
constraint ux_s_meta_module_key_revision unique (b_module_key, b_revision_no)
);
create index ix_s_meta_module_key
on dbo.s_meta_module (b_module_key, b_enabled);
2.2 实体
create table dbo.s_meta_entity (
b_id bigint identity(1, 1) not null,
b_entity_key nvarchar(192) not null,
b_revision_no int not null,
b_module_key nvarchar(128) not null,
b_name_key nvarchar(256) not null,
b_description nvarchar(1000) null,
b_physical_table_name sysname not null,
b_primary_key_field nvarchar(128) not null
constraint df_s_meta_entity_primary_key_field default N'b_id',
b_delete_policy nvarchar(64) not null,
b_origin nvarchar(32) not null
constraint df_s_meta_entity_origin default N'platform',
b_enabled tinyint not null
constraint df_s_meta_entity_enabled default 1,
b_protected tinyint not null
constraint df_s_meta_entity_protected default 0,
b_required_by_code tinyint not null
constraint df_s_meta_entity_required_by_code default 0,
b_deprecated_since nvarchar(64) null,
b_removable_after_version nvarchar(64) null,
b_validator_key nvarchar(192) null,
b_config_text nvarchar(max) null,
b_created_at datetime2(3) not null
constraint df_s_meta_entity_created_at default sysutcdatetime(),
b_created_by nvarchar(128) not null,
constraint pk_s_meta_entity primary key (b_id),
constraint ux_s_meta_entity_key_revision unique (b_entity_key, b_revision_no)
);
create index ix_s_meta_entity_module_key
on dbo.s_meta_entity (b_module_key, b_enabled);
create index ix_s_meta_entity_physical_table_name
on dbo.s_meta_entity (b_physical_table_name);
2.3 字段
create table dbo.s_meta_field (
b_id bigint identity(1, 1) not null,
b_entity_key nvarchar(192) not null,
b_field_key nvarchar(128) not null,
b_revision_no int not null,
b_name_key nvarchar(256) not null,
b_label nvarchar(256) not null,
b_description nvarchar(1000) null,
b_physical_column_name sysname not null,
b_data_type nvarchar(64) not null,
b_semantic_type nvarchar(128) null,
b_write_mode nvarchar(32) not null
constraint df_s_meta_field_write_mode default N'direct',
b_required tinyint not null
constraint df_s_meta_field_required default 0,
b_enabled tinyint not null
constraint df_s_meta_field_enabled default 1,
b_searchable tinyint not null
constraint df_s_meta_field_searchable default 0,
b_sortable tinyint not null
constraint df_s_meta_field_sortable default 0,
b_auditable tinyint not null
constraint df_s_meta_field_auditable default 0,
b_audit_visibility nvarchar(32) null,
b_sensitive tinyint not null
constraint df_s_meta_field_sensitive default 0,
b_max_length int null,
b_numeric_precision tinyint null,
b_numeric_scale tinyint null,
b_temporal_type nvarchar(32) null,
b_unit_key nvarchar(128) null,
b_default_value_text nvarchar(max) null,
b_aliases_text nvarchar(max) null,
b_validation_text nvarchar(max) null,
b_ai_hints_text nvarchar(max) null,
b_origin nvarchar(32) not null
constraint df_s_meta_field_origin default N'platform',
b_protected tinyint not null
constraint df_s_meta_field_protected default 0,
b_required_by_code tinyint not null
constraint df_s_meta_field_required_by_code default 0,
b_deprecated_since nvarchar(64) null,
b_removable_after_version nvarchar(64) null,
b_created_at datetime2(3) not null
constraint df_s_meta_field_created_at default sysutcdatetime(),
b_created_by nvarchar(128) not null,
constraint pk_s_meta_field primary key (b_id),
constraint ux_s_meta_field_key_revision unique (
b_entity_key,
b_field_key,
b_revision_no
)
);
create index ix_s_meta_field_entity_key
on dbo.s_meta_field (b_entity_key, b_enabled, b_field_key);
create index ix_s_meta_field_physical_column_name
on dbo.s_meta_field (b_entity_key, b_physical_column_name);
2.4 实体关系
create table dbo.s_meta_relation (
b_id bigint identity(1, 1) not null,
b_relation_key nvarchar(192) not null,
b_revision_no int not null,
b_module_key nvarchar(128) not null,
b_source_entity_key nvarchar(192) not null,
b_source_field_key nvarchar(128) null,
b_target_entity_key nvarchar(192) not null,
b_target_field_key nvarchar(128) not null
constraint df_s_meta_relation_target_field_key default N'b_id',
b_relation_type nvarchar(32) not null,
b_ownership_type nvarchar(32) not null,
b_required tinyint not null
constraint df_s_meta_relation_required default 0,
b_delete_policy nvarchar(32) not null,
b_save_policy nvarchar(32) not null,
b_sort_field_key nvarchar(128) null,
b_unique_rule_text nvarchar(max) null,
b_enabled tinyint not null
constraint df_s_meta_relation_enabled default 1,
b_config_text nvarchar(max) null,
b_created_at datetime2(3) not null
constraint df_s_meta_relation_created_at default sysutcdatetime(),
b_created_by nvarchar(128) not null,
constraint pk_s_meta_relation primary key (b_id),
constraint ux_s_meta_relation_key_revision unique (
b_relation_key,
b_revision_no
)
);
create index ix_s_meta_relation_source_entity_key
on dbo.s_meta_relation (b_source_entity_key, b_enabled);
create index ix_s_meta_relation_target_entity_key
on dbo.s_meta_relation (b_target_entity_key, b_enabled);
2.5 字典与字典项
create table dbo.s_meta_dictionary (
b_id bigint identity(1, 1) not null,
b_dictionary_key nvarchar(192) not null,
b_revision_no int not null,
b_module_key nvarchar(128) not null,
b_name_key nvarchar(256) not null,
b_description nvarchar(1000) null,
b_enabled tinyint not null
constraint df_s_meta_dictionary_enabled default 1,
b_config_text nvarchar(max) null,
b_created_at datetime2(3) not null
constraint df_s_meta_dictionary_created_at default sysutcdatetime(),
b_created_by nvarchar(128) not null,
constraint pk_s_meta_dictionary primary key (b_id),
constraint ux_s_meta_dictionary_key_revision unique (
b_dictionary_key,
b_revision_no
)
);
create table dbo.s_meta_dictionary_item (
b_id bigint identity(1, 1) not null,
b_dictionary_id bigint not null,
b_item_key nvarchar(128) not null,
b_item_value nvarchar(512) not null,
b_name_key nvarchar(256) not null,
b_sort_no int not null
constraint df_s_meta_dictionary_item_sort_no default 0,
b_enabled tinyint not null
constraint df_s_meta_dictionary_item_enabled default 1,
b_config_text nvarchar(max) null,
constraint pk_s_meta_dictionary_item primary key (b_id),
constraint ux_s_meta_dictionary_item_key unique (
b_dictionary_id,
b_item_key
)
);
create index ix_s_meta_dictionary_item_dictionary_id
on dbo.s_meta_dictionary_item (b_dictionary_id, b_enabled, b_sort_no);
2.6 注册查询资源
create table dbo.s_meta_query_source (
b_id bigint identity(1, 1) not null,
b_query_key nvarchar(192) not null,
b_revision_no int not null,
b_module_key nvarchar(128) not null,
b_name_key nvarchar(256) not null,
b_source_type nvarchar(32) not null,
b_entity_key nvarchar(192) null,
b_statement_text nvarchar(max) null,
b_parameter_schema_text nvarchar(max) null,
b_output_schema_text nvarchar(max) null,
b_permission_key nvarchar(192) null,
b_timeout_seconds int not null
constraint df_s_meta_query_source_timeout_seconds default 30,
b_max_rows int not null
constraint df_s_meta_query_source_max_rows default 1000,
b_enabled tinyint not null
constraint df_s_meta_query_source_enabled default 1,
b_config_text nvarchar(max) null,
b_created_at datetime2(3) not null
constraint df_s_meta_query_source_created_at default sysutcdatetime(),
b_created_by nvarchar(128) not null,
constraint pk_s_meta_query_source primary key (b_id),
constraint ux_s_meta_query_source_key_revision unique (
b_query_key,
b_revision_no
)
);
create index ix_s_meta_query_source_module_key
on dbo.s_meta_query_source (b_module_key, b_enabled);
2.7 页面与菜单
页面是可访问的业务入口,负责把运行时视图、表单或特殊 Vue 组件绑定到稳定路由和页面权限。菜单是页面和模块的导航表现,可以配置目录、页面和外链,但不能替代页面访问权限判断。
create table dbo.s_meta_page (
b_id bigint identity(1, 1) not null,
b_page_key nvarchar(192) not null,
b_revision_no int not null,
b_module_key nvarchar(128) not null,
b_name_key nvarchar(256) not null,
b_page_type nvarchar(32) not null,
b_route nvarchar(256) not null,
b_component_key nvarchar(192) null,
b_view_key nvarchar(192) null,
b_form_key nvarchar(192) null,
b_permission_key nvarchar(192) not null,
b_visible tinyint not null
constraint df_s_meta_page_visible default 1,
b_enabled tinyint not null
constraint df_s_meta_page_enabled default 1,
b_protected tinyint not null
constraint df_s_meta_page_protected default 0,
b_config_text nvarchar(max) null,
b_created_at datetime2(3) not null
constraint df_s_meta_page_created_at default sysutcdatetime(),
b_created_by nvarchar(128) not null,
constraint pk_s_meta_page primary key (b_id),
constraint ux_s_meta_page_key_revision unique (b_page_key, b_revision_no)
);
create index ix_s_meta_page_module_key
on dbo.s_meta_page (b_module_key, b_enabled);
create index ix_s_meta_page_route
on dbo.s_meta_page (b_route, b_enabled);
create table dbo.s_meta_menu (
b_id bigint identity(1, 1) not null,
b_menu_key nvarchar(192) not null,
b_revision_no int not null,
b_module_key nvarchar(128) not null,
b_parent_menu_key nvarchar(192) null,
b_name_key nvarchar(256) not null,
b_menu_type nvarchar(32) not null,
b_page_key nvarchar(192) null,
b_route nvarchar(256) null,
b_permission_key nvarchar(192) null,
b_icon_key nvarchar(128) null,
b_sort_no int not null
constraint df_s_meta_menu_sort_no default 0,
b_visible tinyint not null
constraint df_s_meta_menu_visible default 1,
b_enabled tinyint not null
constraint df_s_meta_menu_enabled default 1,
b_config_text nvarchar(max) null,
b_created_at datetime2(3) not null
constraint df_s_meta_menu_created_at default sysutcdatetime(),
b_created_by nvarchar(128) not null,
constraint pk_s_meta_menu primary key (b_id),
constraint ux_s_meta_menu_key_revision unique (b_menu_key, b_revision_no)
);
create index ix_s_meta_menu_parent_key
on dbo.s_meta_menu (b_parent_menu_key, b_sort_no, b_enabled);
create index ix_s_meta_menu_page_key
on dbo.s_meta_menu (b_page_key, b_enabled);
约束由元数据校验器执行:directory 菜单不能绑定页面或路由,page 菜单必须绑定 b_page_key,external 菜单必须填写 b_route 和 b_permission_key;内部页面菜单的路由必须从页面资源解析,不能单独维护第二份内部路由,权限默认继承所绑定页面的 b_permission_key。目录仅在至少存在一个可访问子页面时显示。
2.8 列表与详情视图
create table dbo.s_meta_view (
b_id bigint identity(1, 1) not null,
b_view_key nvarchar(192) not null,
b_revision_no int not null,
b_module_key nvarchar(128) not null,
b_entity_key nvarchar(192) not null,
b_name_key nvarchar(256) not null,
b_view_type nvarchar(32) not null,
b_query_source_key nvarchar(192) null,
b_page_size int not null
constraint df_s_meta_view_page_size default 50,
b_enabled tinyint not null
constraint df_s_meta_view_enabled default 1,
b_config_text nvarchar(max) null,
b_created_at datetime2(3) not null
constraint df_s_meta_view_created_at default sysutcdatetime(),
b_created_by nvarchar(128) not null,
constraint pk_s_meta_view primary key (b_id),
constraint ux_s_meta_view_key_revision unique (b_view_key, b_revision_no)
);
create table dbo.s_meta_view_field (
b_id bigint identity(1, 1) not null,
b_view_id bigint not null,
b_field_key nvarchar(128) not null,
b_sort_no int not null
constraint df_s_meta_view_field_sort_no default 0,
b_visible tinyint not null
constraint df_s_meta_view_field_visible default 1,
b_width int null,
b_min_width int null,
b_fixed_position nvarchar(16) null,
b_sortable tinyint not null
constraint df_s_meta_view_field_sortable default 0,
b_filterable tinyint not null
constraint df_s_meta_view_field_filterable default 0,
b_formatter_key nvarchar(128) null,
b_align_type nvarchar(16) null,
b_config_text nvarchar(max) null,
constraint pk_s_meta_view_field primary key (b_id),
constraint ux_s_meta_view_field_key unique (b_view_id, b_field_key)
);
create index ix_s_meta_view_entity_key
on dbo.s_meta_view (b_entity_key, b_view_type, b_enabled);
create index ix_s_meta_view_field_view_id
on dbo.s_meta_view_field (b_view_id, b_sort_no);
2.9 动态表单与主子表区域
create table dbo.s_meta_form (
b_id bigint identity(1, 1) not null,
b_form_key nvarchar(192) not null,
b_revision_no int not null,
b_module_key nvarchar(128) not null,
b_entity_key nvarchar(192) not null,
b_name_key nvarchar(256) not null,
b_form_type nvarchar(32) not null
constraint df_s_meta_form_form_type default N'edit',
b_column_count tinyint not null
constraint df_s_meta_form_column_count default 2,
b_enabled tinyint not null
constraint df_s_meta_form_enabled default 1,
b_layout_text nvarchar(max) null,
b_config_text nvarchar(max) null,
b_created_at datetime2(3) not null
constraint df_s_meta_form_created_at default sysutcdatetime(),
b_created_by nvarchar(128) not null,
constraint pk_s_meta_form primary key (b_id),
constraint ux_s_meta_form_key_revision unique (b_form_key, b_revision_no)
);
create table dbo.s_meta_form_field (
b_id bigint identity(1, 1) not null,
b_form_id bigint not null,
b_field_key nvarchar(128) not null,
b_group_key nvarchar(128) null,
b_row_no int not null,
b_column_no tinyint not null,
b_column_span tinyint not null
constraint df_s_meta_form_field_column_span default 1,
b_sort_no int not null
constraint df_s_meta_form_field_sort_no default 0,
b_component_type nvarchar(64) not null,
b_visible tinyint not null
constraint df_s_meta_form_field_visible default 1,
b_readonly tinyint not null
constraint df_s_meta_form_field_readonly default 0,
b_required_override tinyint null,
b_label_position nvarchar(16) null,
b_component_props_text nvarchar(max) null,
b_validation_text nvarchar(max) null,
b_config_text nvarchar(max) null,
constraint pk_s_meta_form_field primary key (b_id),
constraint ux_s_meta_form_field_key unique (b_form_id, b_field_key)
);
create table dbo.s_meta_form_relation (
b_id bigint identity(1, 1) not null,
b_form_id bigint not null,
b_relation_key nvarchar(192) not null,
b_group_key nvarchar(128) null,
b_child_view_key nvarchar(192) not null,
b_child_form_key nvarchar(192) null,
b_display_mode nvarchar(32) not null
constraint df_s_meta_form_relation_display_mode default N'table',
b_row_no int not null,
b_column_no tinyint not null
constraint df_s_meta_form_relation_column_no default 1,
b_column_span tinyint not null
constraint df_s_meta_form_relation_column_span default 2,
b_sort_no int not null
constraint df_s_meta_form_relation_sort_no default 0,
b_editable tinyint not null
constraint df_s_meta_form_relation_editable default 1,
b_allow_add tinyint not null
constraint df_s_meta_form_relation_allow_add default 1,
b_allow_delete tinyint not null
constraint df_s_meta_form_relation_allow_delete default 1,
b_allow_sort tinyint not null
constraint df_s_meta_form_relation_allow_sort default 0,
b_min_rows int null,
b_max_rows int null,
b_config_text nvarchar(max) null,
constraint pk_s_meta_form_relation primary key (b_id),
constraint ux_s_meta_form_relation_key unique (b_form_id, b_relation_key)
);
create index ix_s_meta_form_entity_key
on dbo.s_meta_form (b_entity_key, b_form_type, b_enabled);
create index ix_s_meta_form_field_form_id
on dbo.s_meta_form_field (b_form_id, b_row_no, b_column_no, b_sort_no);
create index ix_s_meta_form_relation_form_id
on dbo.s_meta_form_relation (b_form_id, b_row_no, b_column_no, b_sort_no);
2.10 业务动作
create table dbo.s_meta_action (
b_id bigint identity(1, 1) not null,
b_action_key nvarchar(192) not null,
b_revision_no int not null,
b_module_key nvarchar(128) not null,
b_entity_key nvarchar(192) null,
b_name_key nvarchar(256) not null,
b_action_type nvarchar(32) not null,
b_handler_key nvarchar(192) null,
b_permission_key nvarchar(192) not null,
b_input_schema_text nvarchar(max) null,
b_output_schema_text nvarchar(max) null,
b_precondition_text nvarchar(max) null,
b_audit_event_key nvarchar(192) null,
b_confirmation_mode nvarchar(32) null,
b_idempotency_required tinyint not null
constraint df_s_meta_action_idempotency_required default 1,
b_enabled tinyint not null
constraint df_s_meta_action_enabled default 1,
b_config_text nvarchar(max) null,
b_created_at datetime2(3) not null
constraint df_s_meta_action_created_at default sysutcdatetime(),
b_created_by nvarchar(128) not null,
constraint pk_s_meta_action primary key (b_id),
constraint ux_s_meta_action_key_revision unique (b_action_key, b_revision_no)
);
create index ix_s_meta_action_entity_key
on dbo.s_meta_action (b_entity_key, b_enabled);
create index ix_s_meta_action_permission_key
on dbo.s_meta_action (b_permission_key);
2.11 多语言
create table dbo.s_meta_i18n (
b_id bigint identity(1, 1) not null,
b_resource_key nvarchar(256) not null,
b_locale nvarchar(32) not null,
b_revision_no int not null,
b_resource_value nvarchar(max) not null,
b_source_type nvarchar(32) not null
constraint df_s_meta_i18n_source_type default N'manual',
b_resource_status nvarchar(32) not null
constraint df_s_meta_i18n_resource_status default N'confirmed',
b_model_key nvarchar(128) null,
b_created_at datetime2(3) not null
constraint df_s_meta_i18n_created_at default sysutcdatetime(),
b_created_by nvarchar(128) not null,
constraint pk_s_meta_i18n primary key (b_id),
constraint ux_s_meta_i18n_key_locale_revision unique (
b_resource_key,
b_locale,
b_revision_no
)
);
create index ix_s_meta_i18n_resource_key
on dbo.s_meta_i18n (b_resource_key, b_locale);
3. 配置版本与 Schema Compiler
3.1 配置变更集
create table dbo.s_meta_change_set (
b_id bigint identity(1, 1) not null,
b_change_set_no bigint not null,
b_base_release_id bigint null,
b_operation_type nvarchar(32) not null,
b_reason nvarchar(1000) null,
b_change_text nvarchar(max) not null,
b_ddl_plan_text nvarchar(max) null,
b_validation_text nvarchar(max) null,
b_impact_text nvarchar(max) null,
b_checksum varchar(128) not null,
b_execution_status nvarchar(32) not null,
b_created_at datetime2(3) not null
constraint df_s_meta_change_set_created_at default sysutcdatetime(),
b_created_by nvarchar(128) not null,
b_completed_at datetime2(3) null,
b_error_code nvarchar(128) null,
b_error_message nvarchar(2000) null,
constraint pk_s_meta_change_set primary key (b_id),
constraint ux_s_meta_change_set_no unique (b_change_set_no)
);
create index ix_s_meta_change_set_base_release_id
on dbo.s_meta_change_set (b_base_release_id);
create index ix_s_meta_change_set_execution_status
on dbo.s_meta_change_set (b_execution_status, b_created_at);
3.2 不可变配置版本
create table dbo.s_meta_release (
b_id bigint identity(1, 1) not null,
b_release_no bigint not null,
b_change_set_id bigint not null,
b_checksum varchar(128) not null,
b_validation_status nvarchar(32) not null,
b_description nvarchar(1000) null,
b_created_at datetime2(3) not null
constraint df_s_meta_release_created_at default sysutcdatetime(),
b_created_by nvarchar(128) not null,
constraint pk_s_meta_release primary key (b_id),
constraint ux_s_meta_release_no unique (b_release_no),
constraint ux_s_meta_release_checksum unique (b_checksum)
);
create table dbo.s_meta_release_resource (
b_id bigint identity(1, 1) not null,
b_release_id bigint not null,
b_resource_type nvarchar(64) not null,
b_resource_key nvarchar(256) not null,
b_resource_id bigint not null,
b_resource_revision_no int not null,
b_checksum varchar(128) not null,
constraint pk_s_meta_release_resource primary key (b_id),
constraint ux_s_meta_release_resource_key unique (
b_release_id,
b_resource_type,
b_resource_key
)
);
create index ix_s_meta_release_resource_release_id
on dbo.s_meta_release_resource (b_release_id, b_resource_type);
create index ix_s_meta_release_resource_resource_id
on dbo.s_meta_release_resource (b_resource_id);
3.3 当前运行版本与激活历史
create table dbo.s_meta_runtime_state (
b_id bigint identity(1, 1) not null,
b_state_key nvarchar(64) not null
constraint df_s_meta_runtime_state_state_key default N'default',
b_current_release_id bigint not null,
b_updated_at datetime2(3) not null
constraint df_s_meta_runtime_state_updated_at default sysutcdatetime(),
b_updated_by nvarchar(128) not null,
b_row_version rowversion not null,
constraint pk_s_meta_runtime_state primary key (b_id),
constraint ux_s_meta_runtime_state_key unique (b_state_key)
);
create table dbo.s_meta_release_activation (
b_id bigint identity(1, 1) not null,
b_release_id bigint not null,
b_previous_release_id bigint null,
b_activation_type nvarchar(32) not null,
b_reason nvarchar(1000) null,
b_request_id nvarchar(128) null,
b_trace_id nvarchar(128) null,
b_activated_at datetime2(3) not null
constraint df_s_meta_release_activation_activated_at default sysutcdatetime(),
b_activated_by nvarchar(128) not null,
constraint pk_s_meta_release_activation primary key (b_id)
);
create index ix_s_meta_release_activation_release_id
on dbo.s_meta_release_activation (b_release_id, b_activated_at desc);
3.4 Schema 迁移任务与步骤
create table dbo.s_schema_migration (
b_id bigint identity(1, 1) not null,
b_change_set_id bigint not null,
b_target_release_id bigint null,
b_migration_status nvarchar(32) not null,
b_lock_owner nvarchar(128) null,
b_lock_expires_at datetime2(3) null,
b_plan_checksum varchar(128) not null,
b_current_step_no int null,
b_started_at datetime2(3) null,
b_completed_at datetime2(3) null,
b_created_at datetime2(3) not null
constraint df_s_schema_migration_created_at default sysutcdatetime(),
b_created_by nvarchar(128) not null,
b_error_code nvarchar(128) null,
b_error_message nvarchar(2000) null,
constraint pk_s_schema_migration primary key (b_id),
constraint ux_s_schema_migration_change_set_id unique (b_change_set_id)
);
create table dbo.s_schema_migration_step (
b_id bigint identity(1, 1) not null,
b_migration_id bigint not null,
b_step_no int not null,
b_step_type nvarchar(32) not null,
b_object_key nvarchar(256) null,
b_statement_text nvarchar(max) null,
b_rollback_statement_text nvarchar(max) null,
b_checksum varchar(128) not null,
b_step_status nvarchar(32) not null,
b_started_at datetime2(3) null,
b_completed_at datetime2(3) null,
b_result_text nvarchar(max) null,
b_error_message nvarchar(2000) null,
constraint pk_s_schema_migration_step primary key (b_id),
constraint ux_s_schema_migration_step_no unique (b_migration_id, b_step_no)
);
create index ix_s_schema_migration_status
on dbo.s_schema_migration (b_migration_status, b_created_at);
create index ix_s_schema_migration_step_migration_id
on dbo.s_schema_migration_step (b_migration_id, b_step_status, b_step_no);
4. 统一权限中心
4.1 角色与用户角色关系
create table dbo.s_auth_role (
b_id bigint identity(1, 1) not null,
b_role_key nvarchar(128) not null,
b_role_name nvarchar(256) not null,
b_description nvarchar(1000) null,
b_role_type nvarchar(32) not null
constraint df_s_auth_role_role_type default N'custom',
b_enabled tinyint not null
constraint df_s_auth_role_enabled default 1,
b_created_at datetime2(3) not null
constraint df_s_auth_role_created_at default sysutcdatetime(),
b_created_by nvarchar(128) not null,
b_updated_at datetime2(3) null,
b_updated_by nvarchar(128) null,
b_row_version rowversion not null,
constraint pk_s_auth_role primary key (b_id),
constraint ux_s_auth_role_key unique (b_role_key)
);
create table dbo.s_auth_user_role (
b_id bigint identity(1, 1) not null,
b_user_key nvarchar(128) not null,
b_role_key nvarchar(128) not null,
b_enabled tinyint not null
constraint df_s_auth_user_role_enabled default 1,
b_effective_from datetime2(3) null,
b_effective_to datetime2(3) null,
b_created_at datetime2(3) not null
constraint df_s_auth_user_role_created_at default sysutcdatetime(),
b_created_by nvarchar(128) not null,
constraint pk_s_auth_user_role primary key (b_id),
constraint ux_s_auth_user_role_key unique (b_user_key, b_role_key)
);
create index ix_s_auth_user_role_role_key
on dbo.s_auth_user_role (b_role_key, b_enabled);
4.2 功能权限
create table dbo.s_auth_permission (
b_id bigint identity(1, 1) not null,
b_permission_key nvarchar(192) not null,
b_module_key nvarchar(128) null,
b_resource_type nvarchar(32) not null,
b_resource_key nvarchar(256) not null,
b_action_type nvarchar(64) null,
b_name_key nvarchar(256) not null,
b_description nvarchar(1000) null,
b_enabled tinyint not null
constraint df_s_auth_permission_enabled default 1,
b_protected tinyint not null
constraint df_s_auth_permission_protected default 0,
b_created_at datetime2(3) not null
constraint df_s_auth_permission_created_at default sysutcdatetime(),
b_created_by nvarchar(128) not null,
constraint pk_s_auth_permission primary key (b_id),
constraint ux_s_auth_permission_key unique (b_permission_key)
);
create table dbo.s_auth_role_permission (
b_id bigint identity(1, 1) not null,
b_role_key nvarchar(128) not null,
b_permission_key nvarchar(192) not null,
b_permission_effect nvarchar(16) not null
constraint df_s_auth_role_permission_effect default N'allow',
b_created_at datetime2(3) not null
constraint df_s_auth_role_permission_created_at default sysutcdatetime(),
b_created_by nvarchar(128) not null,
constraint pk_s_auth_role_permission primary key (b_id),
constraint ux_s_auth_role_permission_key unique (
b_role_key,
b_permission_key
)
);
create index ix_s_auth_permission_resource_key
on dbo.s_auth_permission (b_resource_type, b_resource_key, b_enabled);
create index ix_s_auth_role_permission_permission_key
on dbo.s_auth_role_permission (b_permission_key, b_permission_effect);
4.3 数据范围权限
create table dbo.s_auth_data_policy (
b_id bigint identity(1, 1) not null,
b_policy_key nvarchar(192) not null,
b_module_key nvarchar(128) null,
b_entity_key nvarchar(192) not null,
b_policy_name nvarchar(256) not null,
b_action_text nvarchar(max) not null,
b_scope_text nvarchar(max) not null,
b_enabled tinyint not null
constraint df_s_auth_data_policy_enabled default 1,
b_priority_no int not null
constraint df_s_auth_data_policy_priority_no default 0,
b_created_at datetime2(3) not null
constraint df_s_auth_data_policy_created_at default sysutcdatetime(),
b_created_by nvarchar(128) not null,
b_updated_at datetime2(3) null,
b_updated_by nvarchar(128) null,
b_row_version rowversion not null,
constraint pk_s_auth_data_policy primary key (b_id),
constraint ux_s_auth_data_policy_key unique (b_policy_key)
);
create table dbo.s_auth_role_data_policy (
b_id bigint identity(1, 1) not null,
b_role_key nvarchar(128) not null,
b_policy_key nvarchar(192) not null,
b_policy_effect nvarchar(16) not null
constraint df_s_auth_role_data_policy_effect default N'allow',
b_created_at datetime2(3) not null
constraint df_s_auth_role_data_policy_created_at default sysutcdatetime(),
b_created_by nvarchar(128) not null,
constraint pk_s_auth_role_data_policy primary key (b_id),
constraint ux_s_auth_role_data_policy_key unique (
b_role_key,
b_policy_key
)
);
create index ix_s_auth_data_policy_entity_key
on dbo.s_auth_data_policy (b_entity_key, b_enabled, b_priority_no);
create index ix_s_auth_role_data_policy_policy_key
on dbo.s_auth_role_data_policy (b_policy_key, b_policy_effect);
4.4 字段查看、导出和脱敏权限
create table dbo.s_auth_field_policy (
b_id bigint identity(1, 1) not null,
b_policy_key nvarchar(256) not null,
b_entity_key nvarchar(192) not null,
b_field_key nvarchar(128) not null,
b_subject_type nvarchar(32) not null,
b_subject_key nvarchar(128) not null,
b_view_effect nvarchar(16) not null
constraint df_s_auth_field_policy_view_effect default N'allow',
b_export_effect nvarchar(16) not null
constraint df_s_auth_field_policy_export_effect default N'allow',
b_mask_mode nvarchar(32) not null
constraint df_s_auth_field_policy_mask_mode default N'none',
b_mask_config_text nvarchar(max) null,
b_priority_no int not null
constraint df_s_auth_field_policy_priority_no default 0,
b_enabled tinyint not null
constraint df_s_auth_field_policy_enabled default 1,
b_created_at datetime2(3) not null
constraint df_s_auth_field_policy_created_at default sysutcdatetime(),
b_created_by nvarchar(128) not null,
b_updated_at datetime2(3) null,
b_updated_by nvarchar(128) null,
b_row_version rowversion not null,
constraint pk_s_auth_field_policy primary key (b_id),
constraint ux_s_auth_field_policy_key unique (b_policy_key),
constraint ux_s_auth_field_policy_subject unique (
b_entity_key,
b_field_key,
b_subject_type,
b_subject_key
)
);
create index ix_s_auth_field_policy_lookup
on dbo.s_auth_field_policy (
b_subject_type,
b_subject_key,
b_entity_key,
b_enabled,
b_priority_no
);
create index ix_s_auth_field_policy_field_key
on dbo.s_auth_field_policy (b_entity_key, b_field_key, b_enabled);
4.5 权限快照
create table dbo.s_auth_permission_snapshot (
b_id bigint identity(1, 1) not null,
b_user_key nvarchar(128) not null,
b_snapshot_version bigint not null,
b_release_id bigint not null,
b_permission_text nvarchar(max) not null,
b_checksum varchar(128) not null,
b_created_at datetime2(3) not null
constraint df_s_auth_permission_snapshot_created_at default sysutcdatetime(),
b_expires_at datetime2(3) null,
b_invalidated_at datetime2(3) null,
constraint pk_s_auth_permission_snapshot primary key (b_id),
constraint ux_s_auth_permission_snapshot_version unique (
b_user_key,
b_snapshot_version
)
);
create index ix_s_auth_permission_snapshot_user_key
on dbo.s_auth_permission_snapshot (b_user_key, b_invalidated_at, b_expires_at);
5. 日志与审计
5.1 技术日志
技术日志主要用于请求链路、SQL、异常、性能和外部接口排查,推荐写入 Loki、OpenSearch、Elasticsearch 等日志平台。下面的表适合集中日志库或短期数据库兜底,不建议把所有高频技术日志长期写入租户业务库。
create table dbo.s_log_technical (
b_id bigint identity(1, 1) not null,
b_occurred_at datetime2(3) not null
constraint df_s_log_technical_occurred_at default sysutcdatetime(),
b_log_level nvarchar(16) not null,
b_log_category nvarchar(64) not null,
b_operation nvarchar(192) not null,
b_org_id nvarchar(128) null,
b_user_key nvarchar(128) null,
b_source_type nvarchar(32) null,
b_module_key nvarchar(128) null,
b_entity_key nvarchar(192) null,
b_action_key nvarchar(192) null,
b_request_id nvarchar(128) null,
b_trace_id nvarchar(128) null,
b_application_version nvarchar(128) null,
b_server_node nvarchar(128) null,
b_duration_ms bigint null,
b_result_code nvarchar(128) null,
b_error_code nvarchar(128) null,
b_error_message nvarchar(2000) null,
b_exception_text nvarchar(max) null,
b_context_text nvarchar(max) null,
constraint pk_s_log_technical primary key (b_id)
);
create index ix_s_log_technical_trace_id
on dbo.s_log_technical (b_trace_id, b_occurred_at desc);
create index ix_s_log_technical_org_time
on dbo.s_log_technical (b_org_id, b_occurred_at desc);
create index ix_s_log_technical_level_time
on dbo.s_log_technical (b_log_level, b_occurred_at desc);
5.2 登录日志
登录日志记录登录成功、失败、退出、刷新令牌和账号锁定等安全事件。它可以与技术日志使用相同的 b_request_id、b_trace_id 关联,但业务职责独立。
create table dbo.s_log_login (
b_id bigint identity(1, 1) not null,
b_org_id nvarchar(128) null,
b_user_key nvarchar(128) null,
b_login_name nvarchar(256) null,
b_login_type nvarchar(32) not null,
b_login_status nvarchar(32) not null,
b_auth_method nvarchar(32) null,
b_failure_reason nvarchar(512) null,
b_ip_address varchar(64) null,
b_user_agent nvarchar(1000) null,
b_device_key nvarchar(256) null,
b_request_id nvarchar(128) null,
b_trace_id nvarchar(128) null,
b_occurred_at datetime2(3) not null
constraint df_s_log_login_occurred_at default sysutcdatetime(),
b_created_at datetime2(3) not null
constraint df_s_log_login_created_at default sysutcdatetime(),
constraint pk_s_log_login primary key (b_id)
);
create index ix_s_log_login_user_time
on dbo.s_log_login (b_user_key, b_occurred_at desc);
create index ix_s_log_login_name_time
on dbo.s_log_login (b_login_name, b_occurred_at desc);
create index ix_s_log_login_status_time
on dbo.s_log_login (b_login_status, b_occurred_at desc);
create index ix_s_log_login_trace_id
on dbo.s_log_login (b_trace_id, b_occurred_at desc);
5.3 业务审计事件与字段变更
create table dbo.s_log_audit (
b_id bigint identity(1, 1) not null,
b_event_key nvarchar(192) not null,
b_module_key nvarchar(128) null,
b_entity_key nvarchar(192) not null,
b_entity_id nvarchar(128) not null,
b_business_no nvarchar(192) null,
b_action_key nvarchar(192) null,
b_operator_key nvarchar(128) not null,
b_operator_name nvarchar(256) null,
b_source_type nvarchar(32) not null,
b_visibility nvarchar(32) not null,
b_request_id nvarchar(128) null,
b_trace_id nvarchar(128) not null,
b_release_id bigint null,
b_business_event_id bigint null,
b_payload_text nvarchar(max) null,
b_occurred_at datetime2(3) not null
constraint df_s_log_audit_occurred_at default sysutcdatetime(),
constraint pk_s_log_audit primary key (b_id)
);
create table dbo.s_log_audit_field (
b_id bigint identity(1, 1) not null,
b_event_id bigint not null,
b_entity_key nvarchar(192) not null,
b_entity_id nvarchar(128) not null,
b_field_key nvarchar(128) not null,
b_field_label_snapshot nvarchar(256) null,
b_before_value_text nvarchar(max) null,
b_after_value_text nvarchar(max) null,
b_before_display_value nvarchar(1000) null,
b_after_display_value nvarchar(1000) null,
b_visibility nvarchar(32) not null,
constraint pk_s_log_audit_field primary key (b_id)
);
create index ix_s_log_audit_entity
on dbo.s_log_audit (b_entity_key, b_entity_id, b_occurred_at desc);
create index ix_s_log_audit_trace_id
on dbo.s_log_audit (b_trace_id);
create index ix_s_log_audit_field_audit_event_id
on dbo.s_log_audit_field (b_event_id);
6. 逻辑外键清单
以下关联不创建物理外键,由服务层、发布校验器和 Schema Compiler 负责检查:
| 表 | 字段 | 逻辑目标 |
|---|---|---|
s_meta_entity |
b_module_key |
s_meta_module.b_module_key |
s_meta_field |
b_entity_key |
s_meta_entity.b_entity_key |
s_meta_relation |
b_source_entity_key |
s_meta_entity.b_entity_key |
s_meta_relation |
b_target_entity_key |
s_meta_entity.b_entity_key |
s_meta_dictionary_item |
b_dictionary_id |
s_meta_dictionary.b_id |
s_meta_page |
b_module_key |
s_meta_module.b_module_key |
s_meta_page |
b_view_key |
s_meta_view.b_view_key |
s_meta_page |
b_form_key |
s_meta_form.b_form_key |
s_meta_page |
b_permission_key |
s_auth_permission.b_permission_key |
s_meta_menu |
b_module_key |
s_meta_module.b_module_key |
s_meta_menu |
b_parent_menu_key |
s_meta_menu.b_menu_key |
s_meta_menu |
b_page_key |
s_meta_page.b_page_key |
s_meta_menu |
b_permission_key |
s_auth_permission.b_permission_key |
s_meta_view |
b_entity_key |
s_meta_entity.b_entity_key |
s_meta_view_field |
b_view_id |
s_meta_view.b_id |
s_meta_form |
b_entity_key |
s_meta_entity.b_entity_key |
s_meta_form_field |
b_form_id |
s_meta_form.b_id |
s_meta_form_relation |
b_form_id |
s_meta_form.b_id |
s_meta_form_relation |
b_relation_key |
s_meta_relation.b_relation_key |
s_meta_form_relation |
b_child_view_key |
s_meta_view.b_view_key |
s_meta_form_relation |
b_child_form_key |
s_meta_form.b_form_key |
s_meta_release |
b_change_set_id |
s_meta_change_set.b_id |
s_meta_release_resource |
b_release_id |
s_meta_release.b_id |
s_meta_runtime_state |
b_current_release_id |
s_meta_release.b_id |
s_schema_migration |
b_change_set_id |
s_meta_change_set.b_id |
s_schema_migration_step |
b_migration_id |
s_schema_migration.b_id |
s_auth_user_role |
b_role_key |
s_auth_role.b_role_key |
s_auth_role_permission |
b_permission_key |
s_auth_permission.b_permission_key |
s_auth_role_data_policy |
b_policy_key |
s_auth_data_policy.b_policy_key |
s_auth_field_policy |
b_entity_key |
s_meta_entity.b_entity_key |
s_auth_field_policy |
b_field_key |
s_meta_field.b_field_key |
s_log_audit_field |
b_event_id |
s_log_audit.b_id |
s_log_technical |
b_user_key |
当前身份系统的用户 b_user_key |
s_log_login |
b_user_key |
当前身份系统的用户 b_user_key |
逻辑外键写入时应执行以下校验:
稳定 key 是否存在
-> 目标资源是否属于当前 release
-> 目标资源是否启用
-> 模块依赖是否合法
-> 字段、关系和页面类型是否匹配
-> 删除或停用前是否仍被其他资源引用
7. 实施建议
建议按以下顺序创建和启用这些表:
元数据基础表
-> 页面和菜单表
-> 视图和动态表单表
-> 配置 release 表
-> Schema 迁移表
-> 权限表
-> 日志与审计表
正式执行前还应补充:
- 根据实际 SQL Server 2022 环境确认过滤索引和
datetime2支持情况。 - 根据现有用户表确定
b_user_key、b_created_by和b_updated_by的实际数据类型。 - 根据最终稳定 key 长度评估唯一索引的键长度。
- 为高数据量审计表制定归档及清理策略。
- 用独立测试数据库执行完整建表脚本,并验证重复安装、初始化 release 和回滚流程。