-- =========================================================================== -- UAT 租户占位菜单收口 —— 人工运维脚本(对账报表 + 回滚) -- -- ⚠️ 本文件**不会**被 AutoVersionUpdate 自动执行: -- LoadMigrationScripts(AutoVersionUpdate.cs:391-420)先排除 *.verify.sql, -- 再对 Path.GetFileNameWithoutExtension 做 Version.TryParse; -- "UAT-PLACEHOLDER-MENU-HIDE.ops" 解析失败 → 该文件被过滤掉。 -- **不要给本文件加 1.0. 版本号前缀**,否则会变成自动执行的迁移脚本。 -- -- 自动执行的断言在 1.0.424.verify.sql(真值标量,环境无关)。 -- 本文件供人工按需执行,两段互相独立,**不要整文件一次跑完**。 -- =========================================================================== -- ########################################################################### -- 第一段 · 对账报表(只读,可随时执行) -- ########################################################################### SET @t_uat := (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id = t.OrgId WHERE o.Code = 'UATTEST_CHL' AND t.Status = 1 LIMIT 1); -- R0 租户解析 SELECT 'R0 租户解析' AS Chk, @t_uat AS TenantId, (SELECT o.Code FROM SysTenant t JOIN SysOrg o ON o.Id = t.OrgId WHERE t.Id = @t_uat) AS OrgCode; -- R1 抑制清单明细 SELECT 'R1 抑制清单' AS Chk, s.MenuId, m.Path, m.Component, m.Status, s.Reason FROM ado_tenant_menu_suppression s JOIN SysMenu m ON m.Id = s.MenuId WHERE s.TenantId = @t_uat ORDER BY m.Path; -- R2 该租户 SysTenantMenu 总行数(收口前 493 → 收口后 477) SELECT 'R2 该租户租户菜单总行数' AS Chk, COUNT(*) AS Rows_ FROM SysTenantMenu WHERE TenantId = @t_uat; -- R3 该租户当前仍可见的 planning 占位菜单(本轮范围内应为空;S9/S4/M11-M16 不在范围) SELECT 'R3 仍可见的占位菜单' AS Chk, m.Path, m.Component FROM SysMenu m JOIN SysTenantMenu tm ON tm.MenuId = m.Id AND tm.TenantId = @t_uat WHERE m.Status = 1 AND m.Type <> 3 AND m.Component = '/aidop/planning/index' ORDER BY m.Path; -- R4 跨租户对账:其余租户对这些菜单的授权行数(应各自保持原值不变) SELECT 'R4 跨租户授权' AS Chk, t.Id AS TenantId, o.Code AS OrgCode, (SELECT COUNT(*) FROM SysTenantMenu tm WHERE tm.TenantId = t.Id AND tm.MenuId IN (SELECT MenuId FROM ado_tenant_menu_suppression WHERE TenantId = @t_uat)) AS GrantedRows FROM SysTenant t JOIN SysOrg o ON o.Id = t.OrgId WHERE t.Id <> @t_uat ORDER BY t.Id; -- R5 SysRoleMenu 保留情况(本脚本从不改动它;用于确认回滚可精确还原) SELECT 'R5 角色授权保留' AS Chk, COUNT(*) AS Rows_ FROM SysRoleMenu rm JOIN SysRole r ON r.Id = rm.RoleId WHERE r.TenantId = @t_uat AND rm.MenuId IN (SELECT MenuId FROM ado_tenant_menu_suppression WHERE TenantId = @t_uat); -- ########################################################################### -- 第二段 · 回滚(会改数据,确认后再单独执行) -- -- 步骤:执行下方 DELETE → 重启后端(restart_aidop.sh)。 -- AidopMenuLinkSync.EnsureLinked 会按原主键 -- CommonUtil.GetFixedHashCode(""+tid+menuId, 1300000000000) -- 把 SysTenantMenu 授权行原样补回;SysRoleMenu 全程未被改动, -- 因此可见性精确还原到收口之前。该路径已实测验证。 -- ########################################################################### -- DELETE FROM ado_tenant_menu_suppression -- WHERE TenantId = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id = t.OrgId -- WHERE o.Code = 'UATTEST_CHL' AND t.Status = 1 LIMIT 1);