20260831172912

This commit is contained in:
oneao committed 2026-08-31 17:29:13 +08:00
1 parent d6a56eb17f
commit 4d46ce6c53
61 files changed
+2086 -2979

No files matched your search

@@ -19,7 +19,7 @@ BEGIN TRANSACTION;
CREATE TABLE dbo.s_log_login (
b_id bigint NOT NULL,
b_user_id bigint NULL,
b_account varchar(50) NULL,
b_account nvarchar(50) NULL,
b_login_type varchar(20) NOT NULL, -- 登录类型:password/token/oidc/ldap
b_login_result int NOT NULL CONSTRAINT DF_s_log_login_result DEFAULT (0),
b_fail_reason nvarchar(200) NULL,
@@ -0,0 +1,46 @@
/*
日志表账号列改为 nvarchar:s_log_login.b_account / s_log_technical.b_account 原为 varchar(50),
中文账号写入会因代码页转换变为 '?'(b_user.b_account 本身是 nvarchar,账号支持中文,见
100_initialize_fms_new.sql)。改为 nvarchar(50) 与用户表对齐。
可重复执行:仅在列存在且当前类型为 varchar 时才 ALTER。
s_log_login.b_account 上有索引 IX_s_log_login_account,SQL Server 修改列类型前需先删除、改完重建。
*/
SET NOCOUNT ON;
SET XACT_ABORT ON;
BEGIN TRANSACTION;
IF OBJECT_ID(N'dbo.s_log_login', N'U') IS NOT NULL
AND EXISTS (
SELECT 1
FROM sys.columns c
JOIN sys.types t ON t.user_type_id = c.user_type_id
WHERE c.object_id = OBJECT_ID(N'dbo.s_log_login')
AND c.name = N'b_account'
AND t.name = N'varchar'
)
BEGIN
IF OBJECT_ID(N'dbo.IX_s_log_login_account', N'INDEX') IS NOT NULL
DROP INDEX IX_s_log_login_account ON dbo.s_log_login;
ALTER TABLE dbo.s_log_login ALTER COLUMN b_account nvarchar(50) NULL;
IF OBJECT_ID(N'dbo.IX_s_log_login_account', N'INDEX') IS NULL
CREATE INDEX IX_s_log_login_account ON dbo.s_log_login (b_account, b_occurdatetime DESC);
END
IF OBJECT_ID(N'dbo.s_log_technical', N'U') IS NOT NULL
AND EXISTS (
SELECT 1
FROM sys.columns c
JOIN sys.types t ON t.user_type_id = c.user_type_id
WHERE c.object_id = OBJECT_ID(N'dbo.s_log_technical')
AND c.name = N'b_account'
AND t.name = N'varchar'
)
BEGIN
ALTER TABLE dbo.s_log_technical ALTER COLUMN b_account nvarchar(50) NULL;
END
COMMIT TRANSACTION;
@@ -0,0 +1,75 @@
/*
为 dbo.s_i18n 增加 b_module_id 列,使多语言数据可按模块级联删除/查询,
解决「删除模块后 s_i18n 残留孤儿数据」的问题(前端按 b_key 前缀匹配清理易漏)。
与 006_add_i18n_module_id.sql 的区别:006 作用于旧表 dbo.b_i18n;
本脚本作用于当前前端实际使用的 dbo.s_i18n。
本脚本可重复执行:
- 列不存在时才添加,并建索引;
- 对存量数据做一次基于键命名约定的回填(module./menu./field./power./group. 前缀,
取第二段作为模块编码关联 s_module.b_code),已回填或无法匹配的行不受影响。
- 通用文案键(common.* 等)不关联模块,b_module_id 保持 NULL。
*/
SET NOCOUNT ON;
-- 第 1 批:DDL(列与索引)
BEGIN TRANSACTION;
IF NOT EXISTS (
SELECT 1 FROM sys.columns
WHERE object_id = OBJECT_ID(N'dbo.s_i18n') AND name = N'b_module_id'
)
BEGIN
ALTER TABLE dbo.s_i18n
ADD b_module_id bigint NULL;
CREATE INDEX IX_s_i18n_module_id ON dbo.s_i18n (b_module_id)
INCLUDE (b_key, b_locale, b_value);
END
COMMIT TRANSACTION;
GO
-- 第 2 批:存量回填(依赖第 1 批列已存在,因此必须 GO 分隔)
SET NOCOUNT ON;
BEGIN TRANSACTION;
-- 键形如 module.<code> / menu.<code> / field.<code>.<item> / power.<code>.<item>
-- / group.<code>.<random>,模块编码恒为第二个以 "." 分隔的片段。
UPDATE i
SET b_module_id = m.b_id
FROM dbo.s_i18n i
CROSS APPLY (
SELECT
CASE
WHEN CHARINDEX(N'.', i.b_key) > 0 THEN
SUBSTRING(
i.b_key,
CHARINDEX(N'.', i.b_key) + 1,
CASE
WHEN CHARINDEX(N'.', i.b_key, CHARINDEX(N'.', i.b_key) + 1) > 0
THEN CHARINDEX(N'.', i.b_key, CHARINDEX(N'.', i.b_key) + 1)
- CHARINDEX(N'.', i.b_key) - 1
ELSE LEN(i.b_key) - CHARINDEX(N'.', i.b_key)
END
)
ELSE NULL
END AS code
) c
CROSS APPLY (
SELECT TOP (1) sm.b_id
FROM dbo.s_module sm
WHERE sm.b_code = c.code
) m
WHERE i.b_module_id IS NULL
AND (
i.b_key LIKE N'module.%'
OR i.b_key LIKE N'menu.%'
OR i.b_key LIKE N'field.%'
OR i.b_key LIKE N'power.%'
OR i.b_key LIKE N'group.%'
);
COMMIT TRANSACTION;
@@ -416,7 +416,7 @@ BEGIN
CREATE TABLE dbo.s_log_technical (
b_id bigint NOT NULL, -- 雪花主键(应用层生成,全局唯一)
b_user_id bigint NULL,
b_account varchar(50) NULL,
b_account nvarchar(50) NULL,
b_sourcetype varchar(20) NULL,
b_loglevel varchar(16) NOT NULL,
b_logcategory varchar(64) NULL,
@@ -443,7 +443,7 @@ BEGIN
CREATE TABLE dbo.s_log_login (
b_id bigint NOT NULL, -- 雪花主键(应用层生成,全局唯一)
b_user_id bigint NULL,
b_account varchar(50) NULL,
b_account nvarchar(50) NULL,
b_login_type varchar(20) NOT NULL,
b_login_result int NOT NULL CONSTRAINT DF_s_log_login_result DEFAULT (0),
b_fail_reason nvarchar(200) NULL,