Files
workspace/code/fms/sql/fms_core.sql
T
2026-09-11 17:31:34 +08:00

515 lines
21 KiB
Transact-SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ============================================================================
FMS 新系统核心表建表脚本 V2
依据文档:FMS新系统核心表结构设计V2.md
使用说明:
1. 执行前先切换到目标数据库(USE [数据库名])。
2. 脚本只建表和索引,不含初始化数据。
3. 不使用外键、CHECK、触发器;关联完整性和业务校验由业务层处理。
4. 表按依赖顺序排列:组织与用户 -> 模块 -> 字段与界面 -> 配置 -> 关系
-> 菜单 -> 多语言 -> 日志 -> 权限。
============================================================================ */
SET NOCOUNT ON;
GO
/* ============================================================================
3.1 用户
============================================================================ */
-- 用户表
create table dbo.b_user (
b_id varchar(50) not null primary key, -- 用户编码(业务键主键)
b_name nvarchar(100) null, -- 用户名
b_dept_id varchar(50) null, -- 所属部门编码
b_bz nvarchar(400) null, -- 备注
b_password nvarchar(255) not null, -- 密码(明文保存)
b_canuse tinyint not null default 1, -- 是否启用(0/1)
b_logincount int not null default 0, -- 登录次数
b_created_by varchar(50) null, -- 创建人
b_created_at datetime2 null, -- 创建时间
b_updated_by varchar(50) null, -- 最后修改人
b_updated_at datetime2 null -- 最后修改时间
);
GO
create index ix_b_user_dept
on dbo.b_user (b_dept_id, b_canuse, b_id);
GO
/* ============================================================================
3.2 部门
============================================================================ */
-- 部门表
create table dbo.b_dept (
b_id varchar(50) not null primary key, -- 部门编码(业务键主键)
b_parent_id varchar(50) null, -- 父部门编码,NULL 表示根节点
b_depth int not null default 0, -- 树层级,根节点为 0
b_path varchar(1000) not null, -- 根到当前部门的路径,例如 /cn/east/
b_name nvarchar(200) not null, -- 部门名称
b_i18n varchar(150) null, -- 多语言资源键
b_canuse tinyint not null default 1, -- 是否启用(0/1)
b_xh int not null default 0, -- 同级显示顺序
b_bz nvarchar(2000) null, -- 备注
b_created_by varchar(50) null, -- 创建人
b_created_at datetime2 null, -- 创建时间
b_updated_by varchar(50) null, -- 最后修改人
b_updated_at datetime2 null -- 最后修改时间
);
GO
create index ix_b_dept_parent
on dbo.b_dept (b_parent_id, b_canuse, b_depth, b_xh, b_id);
GO
create index ix_b_dept_path
on dbo.b_dept (b_path, b_canuse, b_id);
GO
/* ============================================================================
4.1 模块定义
============================================================================ */
-- 模块定义表
create table dbo.s_module (
b_id varchar(50) not null primary key, -- 模块编码(业务键主键)
b_parent_id varchar(50) null, -- 父模块编码,NULL 表示根节点
b_depth int not null default 0, -- 树层级,根节点为 0
b_path varchar(1000) not null, -- 根到当前节点的路径,例如 /sea/container/
b_name nvarchar(200) not null, -- 模块名称
b_i18n varchar(150) null, -- 多语言资源键
b_module_type varchar(20) not null, -- module / data / virtual
b_view_table varchar(128) null, -- 默认查询表或视图
b_save_table varchar(128) null, -- 默认保存目标表
b_key_field varchar(50) null, -- 主键字段
b_order_sql varchar(500) null, -- 默认排序 SQL
b_query_sql nvarchar(max) null, -- 可选查询 SQL 或 SQL 模板
b_config_json nvarchar(max) null, -- 低频模块扩展配置
b_canuse tinyint not null default 1, -- 是否启用(0/1)
b_xh int not null default 0, -- 同级显示顺序
b_bz nvarchar(2000) null -- 备注
);
GO
create index ix_s_module_parent
on dbo.s_module (b_parent_id, b_canuse, b_depth, b_xh, b_id);
GO
create index ix_s_module_path
on dbo.s_module (b_path, b_canuse, b_id);
GO
create index ix_s_module_type
on dbo.s_module (b_module_type, b_canuse, b_xh, b_id);
GO
create index ix_s_module_view_table
on dbo.s_module (b_view_table, b_canuse, b_id);
GO
create index ix_s_module_save_table
on dbo.s_module (b_save_table, b_canuse, b_id);
GO
/* ============================================================================
5. 字段定义
============================================================================ */
-- 字段定义表
create table dbo.s_field (
b_module_id varchar(50) not null, -- 所属 data / virtual 模块编码
b_field varchar(50) not null, -- 模块字段编码或查询结果别名
b_name nvarchar(200) not null, -- 字段名称
b_i18n varchar(150) null, -- 多语言资源键
b_type varchar(30) not null, -- 业务类型
b_canuse tinyint not null default 1, -- 是否启用(0/1)
b_xh int not null default 0, -- 默认顺序
primary key (b_module_id, b_field)
);
GO
create index ix_s_field_module_order
on dbo.s_field (b_module_id, b_canuse, b_xh, b_field);
GO
/* ============================================================================
6. 模块界面配置
============================================================================ */
-- 模块界面配置表
create table dbo.s_module_schema (
b_module_id varchar(50) not null, -- 所属 data / virtual 模块编码
b_schema_type varchar(20) not null, -- view / edit / query
b_schema_json nvarchar(max) not null, -- 完整 JSON 配置
b_canuse tinyint not null default 1, -- 是否启用(0/1)
b_updated_by varchar(50) null, -- 最后修改人
b_updated_at datetime2 null, -- 最后修改时间
primary key (b_module_id, b_schema_type)
);
GO
create index ix_s_module_schema_type
on dbo.s_module_schema (b_module_id, b_schema_type, b_canuse);
GO
/* ============================================================================
7. 用户个性化
============================================================================ */
-- 用户模块偏好表
create table dbo.s_user_module_pref (
b_user_id varchar(50) not null, -- 用户编码
b_module_id varchar(50) not null, -- 模块编码
b_pref_json nvarchar(max) not null, -- 用户偏离配置 JSON
b_updated_by varchar(50) null, -- 最后修改人
b_updated_at datetime2 null, -- 最后修改时间
primary key (b_user_id, b_module_id)
);
GO
create index ix_s_user_module_pref_module
on dbo.s_user_module_pref (b_module_id, b_user_id);
GO
/* ============================================================================
8. 自动编码
============================================================================ */
-- 自动编码表
create table dbo.s_autocode (
b_module_id varchar(50) not null, -- data 模块编码
b_field varchar(50) not null, -- 编码字段
b_prefix nvarchar(200) not null default N'', -- 编码前缀
b_dateformat varchar(30) not null default 'yyyyMM', -- 日期格式
b_separator nvarchar(20) not null default N'-', -- 分隔符
b_seqwidth int not null default 5, -- 序号宽度
b_resettype varchar(10) not null default 'month', -- 重置类型
b_startvalue bigint not null default 1, -- 起始值
b_currentperiod varchar(20) null, -- 当前周期
b_currentvalue bigint not null default 0, -- 当前值
b_canuse tinyint not null default 1, -- 是否启用(0/1)
primary key (b_module_id, b_field)
);
GO
/* ============================================================================
9. 模块关系
============================================================================ */
-- 模块关系表
create table dbo.s_relation (
b_source_module_id varchar(50) not null, -- 源模块
b_source_field varchar(50) not null, -- 源字段
b_target_module_id varchar(50) not null, -- 目标模块
b_target_field varchar(50) not null, -- 目标字段
b_relation_type varchar(20) not null, -- one_to_one / one_to_many / many_to_one
b_canuse tinyint not null default 1, -- 是否启用(0/1)
b_xh int not null default 0, -- 显示顺序
primary key (
b_source_module_id,
b_source_field,
b_target_module_id,
b_target_field
)
);
GO
create index ix_s_relation_source
on dbo.s_relation (b_source_module_id, b_canuse, b_xh, b_source_field, b_target_module_id);
GO
create index ix_s_relation_target
on dbo.s_relation (b_target_module_id, b_canuse, b_source_module_id);
GO
/* ============================================================================
10. 菜单
============================================================================ */
-- 菜单表
create table dbo.s_menu (
b_id varchar(50) not null primary key, -- 菜单编码(业务键主键)
b_parent_id varchar(50) null, -- 父菜单编码,NULL 表示根节点
b_depth int not null default 0, -- 树层级,根节点为 0
b_path varchar(1000) not null, -- 根到当前菜单的路径,例如 /system/user/
b_name nvarchar(200) not null, -- 菜单名称
b_i18n varchar(150) null, -- 多语言资源键
b_menu_type varchar(20) not null, -- directory / page / external
b_route varchar(500) null, -- 页面路由或外链地址
b_icon varchar(50) null, -- 图标
b_xh int not null default 0, -- 显示顺序
b_canuse tinyint not null default 1 -- 是否启用(0/1)
);
GO
create index ix_s_menu_parent
on dbo.s_menu (b_parent_id, b_canuse, b_depth, b_xh, b_id);
GO
create index ix_s_menu_path
on dbo.s_menu (b_path, b_canuse, b_id);
GO
create index ix_s_menu_route
on dbo.s_menu (b_route, b_canuse, b_id);
GO
-- 菜单使用模块关系表
create table dbo.s_menu_module (
b_menu_id varchar(50) not null, -- 菜单编码
b_module_id varchar(50) not null, -- 页面实际使用的 data / virtual 模块编码
b_xh int not null default 0, -- 页面内模块顺序
b_canuse tinyint not null default 1, -- 是否启用(0/1)
primary key (b_menu_id, b_module_id)
);
GO
create index ix_s_menu_module_module
on dbo.s_menu_module (b_module_id, b_canuse, b_menu_id);
GO
/* ============================================================================
11. 多语言
============================================================================ */
-- 多语言类型表
create table dbo.s_i18n_type (
b_id varchar(20) not null primary key, -- 语言区域编码,例如 zh-CN / en
b_name nvarchar(200) not null, -- 语言名称
b_canuse tinyint not null default 1, -- 是否启用(0/1)
b_default tinyint not null default 0, -- 是否默认(0/1)
b_xh int not null default 0 -- 显示顺序
);
GO
-- 多语言资源表
create table dbo.s_i18n (
b_key varchar(150) not null, -- 资源键
b_locale varchar(20) not null, -- 语言区域
b_value nvarchar(1000) not null, -- 翻译值
b_canuse tinyint not null default 1, -- 是否启用(0/1)
primary key (b_key, b_locale)
);
GO
create index ix_s_i18n_locale
on dbo.s_i18n (b_locale, b_canuse, b_key);
GO
/* ============================================================================
12. 日志
============================================================================ */
-- 技术日志表
create table dbo.s_log_technical (
b_id uniqueidentifier not null primary key, -- 日志 ID(UUIDv7)
b_user_id varchar(50) null, -- 用户编码
b_sourcetype varchar(20) null, -- 来源类型
b_loglevel varchar(16) not null, -- 日志级别
b_logcategory varchar(64) null, -- 日志分类
b_operation varchar(100) null, -- 操作
b_module_id varchar(50) null, -- 模块编码
b_request_id varchar(64) null, -- 请求 ID
b_trace_id varchar(64) null, -- 链路 ID
b_server_node varchar(128) null, -- 服务节点
b_duration_ms bigint null, -- 耗时(毫秒)
b_result_code varchar(50) null, -- 结果码
b_error_code varchar(50) null, -- 错误码
b_error_message nvarchar(4000) null, -- 错误信息
b_exception_text nvarchar(max) null, -- 异常文本
b_context_text nvarchar(max) null, -- 上下文文本
b_occurdatetime datetime2 default sysutcdatetime() -- 发生时间
);
GO
-- 登录日志表
create table dbo.s_log_login (
b_id uniqueidentifier not null primary key, -- 日志 ID(UUIDv7)
b_user_id varchar(50) null, -- 用户编码
b_login_type varchar(20) not null, -- 登录类型
b_login_result tinyint not null default 0, -- 登录结果(0/1)
b_fail_reason nvarchar(400) null, -- 失败原因
b_ip varchar(50) null, -- IP
b_ip_location nvarchar(400) null, -- IP 归属地
b_browser varchar(100) null, -- 浏览器
b_browser_version varchar(50) null, -- 浏览器版本
b_os varchar(100) null, -- 操作系统
b_os_version varchar(50) null, -- 系统版本
b_device_type varchar(20) null, -- 设备类型
b_user_agent nvarchar(max) null, -- UserAgent
b_session_id varchar(50) null, -- 会话 ID
b_request_id varchar(64) null, -- 请求 ID
b_trace_id varchar(64) null, -- 链路 ID
b_occurdatetime datetime2 default sysutcdatetime() -- 发生时间
);
GO
-- 审计日志表
create table dbo.s_log_audit (
b_id uniqueidentifier not null primary key, -- 日志 ID(UUIDv7)
b_event_code varchar(50) not null, -- 事件编码
b_module_id varchar(50) null, -- 模块编码
b_data_id varchar(50) null, -- 数据 ID(雪花主键按字符串保存)
b_business_no varchar(50) null, -- 业务单号
b_operation varchar(100) null, -- 操作
b_operator_id varchar(50) null, -- 操作人 ID
b_operator_name nvarchar(200) null, -- 操作人名称
b_source_type varchar(20) not null default 'user', -- 来源类型
b_visibility varchar(20) not null default 'internal', -- 可见性
b_request_id varchar(64) null, -- 请求 ID
b_trace_id varchar(64) null, -- 链路 ID
b_payload_text nvarchar(max) null, -- 载荷文本
b_occurdatetime datetime2 default sysutcdatetime() -- 发生时间
);
GO
-- 审计字段明细表
create table dbo.s_log_audit_field (
b_id uniqueidentifier not null primary key, -- 日志 ID(UUIDv7)
b_event_id uniqueidentifier not null, -- 审计事件 ID
b_module_id varchar(50) null, -- 模块编码
b_data_id varchar(50) null, -- 数据 ID(雪花主键按字符串保存)
b_field varchar(50) not null, -- 字段编码
b_field_label nvarchar(200) null, -- 字段名称
b_before_value nvarchar(max) null, -- 变更前值
b_after_value nvarchar(max) null, -- 变更后值
b_before_display nvarchar(1000) null, -- 变更前显示值
b_after_display nvarchar(1000) null, -- 变更后显示值
b_visibility varchar(20) not null default 'internal' -- 可见性
);
GO
create index ix_s_log_technical_occur
on dbo.s_log_technical (b_occurdatetime, b_id);
GO
create index ix_s_log_technical_trace
on dbo.s_log_technical (b_trace_id, b_occurdatetime);
GO
create index ix_s_log_login_occur
on dbo.s_log_login (b_occurdatetime, b_id);
GO
create index ix_s_log_login_user
on dbo.s_log_login (b_user_id, b_occurdatetime);
GO
create index ix_s_log_audit_occur
on dbo.s_log_audit (b_occurdatetime, b_id);
GO
create index ix_s_log_audit_module
on dbo.s_log_audit (b_module_id, b_data_id, b_occurdatetime);
GO
create index ix_s_log_audit_field_event
on dbo.s_log_audit_field (b_event_id, b_id);
GO
/* ============================================================================
14. 权限设计
============================================================================ */
-- 权限点定义表
create table dbo.s_power (
b_id varchar(150) not null primary key, -- 权限编码,如 module.sea、menu.sea_list
b_name nvarchar(200) not null, -- 权限名称
b_i18n varchar(150) null, -- 多语言资源键
b_type varchar(20) not null, -- menu / module / action(权限点性质)
b_object_type varchar(20) not null, -- menu / module(挂在谁身上)
b_object_id varchar(50) not null, -- s_menu.b_id 或 s_module.b_id
b_action varchar(30) not null, -- access(menu / module 使用权限)或具体业务动作(action)
b_canuse tinyint not null default 1, -- 是否启用(0/1)
b_xh int not null default 0, -- 显示顺序
b_bz nvarchar(500) null -- 备注
);
GO
create index ix_s_power_type
on dbo.s_power (b_type, b_canuse, b_xh, b_id);
GO
create index ix_s_power_object
on dbo.s_power (b_object_type, b_object_id, b_canuse, b_action, b_id);
GO
create unique index ux_s_power_object_action
on dbo.s_power (b_object_type, b_object_id, b_action);
GO
-- 用户权限表
create table dbo.s_user_power (
b_user_id varchar(50) not null, -- 用户编码
b_power_id varchar(150) not null, -- 权限编码
b_canuse tinyint not null default 1, -- 是否启用(0/1)
b_created_by varchar(50) null, -- 创建人
b_created_at datetime2 null, -- 创建时间
b_updated_by varchar(50) null, -- 最后修改人
b_updated_at datetime2 null, -- 最后修改时间
primary key (b_user_id, b_power_id)
);
GO
create index ix_s_user_power_power
on dbo.s_user_power (b_power_id, b_user_id);
GO
-- 用户字段权限表
create table dbo.s_user_field_power (
b_user_id varchar(50) not null, -- 用户编码
b_module_id varchar(50) not null, -- 模块编码
b_field_id varchar(50) not null, -- 字段编码,对应 s_field.b_field
b_view tinyint not null default 1, -- 查看(0/1)
b_edit tinyint not null default 0, -- 编辑(0/1)
b_query tinyint not null default 1, -- 查询(0/1)
b_export tinyint not null default 1, -- 导出(0/1)
b_canuse tinyint not null default 1, -- 是否启用(0/1)
b_created_by varchar(50) null, -- 创建人
b_created_at datetime2 null, -- 创建时间
b_updated_by varchar(50) null, -- 最后修改人
b_updated_at datetime2 null, -- 最后修改时间
primary key (b_user_id, b_module_id, b_field_id)
);
GO
create index ix_s_user_field_power_module
on dbo.s_user_field_power (b_module_id, b_user_id, b_field_id);
GO
-- 用户数据范围表
create table dbo.s_user_data_power (
b_user_id varchar(50) not null, -- 用户编码
b_module_id varchar(50) not null, -- 模块编码
b_operation varchar(30) not null default '*', -- 操作,* 表示全部操作
b_scope_type varchar(20) not null, -- all / self / dept / dept_tree / custom
b_scope_field varchar(50) null, -- 模块中用于范围判断的字段
b_condition_sql nvarchar(max) null, -- 自定义条件 SQL(custom 时使用)
b_xh int not null default 0, -- 同操作内规则顺序
b_canuse tinyint not null default 1, -- 是否启用(0/1)
b_created_by varchar(50) null, -- 创建人
b_created_at datetime2 null, -- 创建时间
b_updated_by varchar(50) null, -- 最后修改人
b_updated_at datetime2 null, -- 最后修改时间
primary key (b_user_id, b_module_id, b_operation, b_xh)
);
GO
create index ix_s_user_data_power_module
on dbo.s_user_data_power (b_module_id, b_user_id, b_operation, b_xh);
GO
/* ============================================================================
13. 业务表主键约定(示例,非核心表,按实际业务表参照执行)
============================================================================ */
/*
-- 业务表示例
create table dbo.b_example (
b_id bigint not null primary key, -- 主键(应用层雪花 ID)
b_inputuser_id varchar(50) null, -- 录入用户 ID
b_inputdatetime datetime2 default sysutcdatetime() -- 录入时间
);
*/