20260728173026
This commit is contained in:
1 parent
63588bd217
commit
5ec7aadef9
25 files changed
+627
-462
No files matched your search
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
为 dbo.b_i18n 增加 b_module_id 列,使多语言数据可按模块级联删除,
|
||||
解决「删除模块后 b_i18n 残留孤儿数据」的问题。
|
||||
|
||||
本脚本可重复执行:
|
||||
- 列不存在时才添加,并建索引;
|
||||
- 对存量数据做一次基于键命名约定的回填(module./menu./field./power. 前缀,
|
||||
取第二段作为模块编码关联 s_module.b_code),已回填或无法匹配的行不受影响。
|
||||
*/
|
||||
SET NOCOUNT ON;
|
||||
|
||||
-- 第 1 批:DDL(列与索引)
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM sys.columns
|
||||
WHERE object_id = OBJECT_ID(N'dbo.b_i18n') AND name = N'b_module_id'
|
||||
)
|
||||
BEGIN
|
||||
ALTER TABLE dbo.b_i18n
|
||||
ADD b_module_id bigint NULL;
|
||||
|
||||
CREATE INDEX IX_b_i18n_module_id ON dbo.b_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>,
|
||||
-- 模块编码恒为第二个以 "." 分隔的片段。
|
||||
UPDATE i
|
||||
SET b_module_id = m.b_id
|
||||
FROM dbo.b_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.%'
|
||||
);
|
||||
|
||||
COMMIT TRANSACTION;
|
||||
@@ -532,7 +532,26 @@ public class DbUtils {
|
||||
}
|
||||
|
||||
private String buildOrderBy(String orderBy) {
|
||||
String[] parts = orderBy.trim().split("\\s+");
|
||||
String trimmed = orderBy.trim();
|
||||
String lower = trimmed.toLowerCase();
|
||||
|
||||
// CASE 表达式:从末尾剥离可选 ASC/DESC,其余直接返回
|
||||
if (lower.startsWith("case")) {
|
||||
String direction = "";
|
||||
if (lower.endsWith(" asc")) {
|
||||
direction = " ASC";
|
||||
trimmed = trimmed.substring(0, trimmed.length() - 4);
|
||||
} else if (lower.endsWith(" desc")) {
|
||||
direction = " DESC";
|
||||
trimmed = trimmed.substring(0, trimmed.length() - 5);
|
||||
}
|
||||
if (!trimmed.trim().toLowerCase().endsWith("end")) {
|
||||
throw new BusinessException("CASE 表达式必须以 END 结尾");
|
||||
}
|
||||
return trimmed + direction;
|
||||
}
|
||||
|
||||
String[] parts = trimmed.split("\\s+");
|
||||
if (parts.length > 2) {
|
||||
throw new BusinessException("排序字段格式不正确");
|
||||
}
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in new issue
Block a user