20260728173026

This commit is contained in:
oneao committed 2026-07-28 17:30:27 +08:00
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;