فهرست منبع

fix(migration): 修正 1.0.384 校验脚本断言写法,避免启动中断

AutoVersionUpdate.RunVerifyScriptIfExists 对 .verify.sql 每条语句取首行首列
当布尔断言(IsTruthy),返回 0 行会得到 NULL 并判假抛出 InvalidOperationException,
中断宿主启动。原第 3 条幂等性检查写成「期望 0 行」,成功时反而判定失败,
导致 1.0.384 标记 Failed 且后端无法启动。

改为三条断言均返回标量真值;并对账号不存在的库短路为真,
避免该脚本分发到无 UATAdminA 的环境时误判失败。

chore: bump version server 1.0.385
YY968XX 16 ساعت پیش
والد
کامیت
0cda0a12ea

+ 3 - 3
server/Admin.NET.Web.Entry/Admin.NET.Web.Entry.csproj

@@ -11,9 +11,9 @@
     <GenerateSatelliteAssembliesForCore>true</GenerateSatelliteAssembliesForCore>
     <Copyright>Admin.NET</Copyright>
     <Description>Admin.NET 通用权限开发平台</Description>
-    <AssemblyVersion>1.0.384</AssemblyVersion>
-    <FileVersion>1.0.384</FileVersion>
-    <Version>1.0.384</Version>
+    <AssemblyVersion>1.0.385</AssemblyVersion>
+    <FileVersion>1.0.385</FileVersion>
+    <Version>1.0.385</Version>
   </PropertyGroup>
 
   <ItemGroup>

+ 42 - 29
server/Admin.NET.Web.Entry/UpdateScripts/1.0.384.verify.sql

@@ -1,33 +1,46 @@
 -- 1.0.384 verify: UATAdminA 应绑定 UAT_FUNCTION_USER 并能解析出菜单。
+--
+-- 约定(AutoVersionUpdate.RunVerifyScriptIfExists):
+--   每条语句取「首行首列」当布尔断言,必须为真(非 0 / 非 NULL / 非空串)。
+--   返回 0 行会得到 NULL → 判假 → 抛异常并中断启动。
+--   因此断言一律写成 SELECT ... 返回标量 1,不要写「期望 0 行」式的查询。
+--
+-- 环境容错:本脚本随仓库分发到所有环境,而 UATAdminA / UAT_FUNCTION_USER
+--   只存在于特定 UAT 库。账号不存在时主脚本为空操作,故断言同样短路为真,
+--   避免在无该账号的库上误判失败。
 
--- 1) 目标账号角色与可解析菜单数
---    期望:roles = 4(原 3 个 SMART_OPS_* + 新增 UAT_FUNCTION_USER),role_menus > 0
-SELECT u.Account,
-       u.AccountType,
-       u.TenantId,
-       COUNT(DISTINCT ur.RoleId) AS roles,
-       COUNT(DISTINCT rm.MenuId) AS role_menus
-FROM SysUser u
-LEFT JOIN SysUserRole ur ON ur.UserId = u.Id
-LEFT JOIN SysRoleMenu rm ON rm.RoleId = ur.RoleId
-WHERE u.Account = 'UATAdminA'
-GROUP BY u.Id, u.Account, u.AccountType, u.TenantId;
+-- 1) 绑定已建立(账号不存在的库短路为真)
+SELECT IF(
+  (SELECT COUNT(*) FROM SysUser WHERE Account = 'UATAdminA' AND Status = 1) = 0,
+  1,
+  (SELECT COUNT(*)
+     FROM SysUserRole ur
+     JOIN SysUser u ON u.Id = ur.UserId
+     JOIN SysRole r ON r.Id = ur.RoleId
+    WHERE u.Account = 'UATAdminA'
+      AND r.Code = 'UAT_FUNCTION_USER')
+) AS ok_binding;
 
--- 2) 与同租户对照账号横向比对
---    期望:UATAdminA 的 role_menus 与其余 5 个账号一致(308)
-SELECT u.Account,
-       COUNT(DISTINCT rm.MenuId) AS role_menus
-FROM SysUser u
-LEFT JOIN SysUserRole ur ON ur.UserId = u.Id
-LEFT JOIN SysRoleMenu rm ON rm.RoleId = ur.RoleId
-WHERE u.TenantId = (SELECT TenantId FROM SysUser WHERE Account = 'UATAdminA')
-GROUP BY u.Id, u.Account
-ORDER BY u.Account;
+-- 2) 该账号可解析出菜单(role_menus > 0,同租户对照账号为 308)
+SELECT IF(
+  (SELECT COUNT(*) FROM SysUser WHERE Account = 'UATAdminA' AND Status = 1) = 0,
+  1,
+  (SELECT COUNT(DISTINCT rm.MenuId)
+     FROM SysUser u
+     JOIN SysUserRole ur ON ur.UserId = u.Id
+     JOIN SysRoleMenu rm ON rm.RoleId = ur.RoleId
+    WHERE u.Account = 'UATAdminA')
+) AS ok_menus;
 
--- 3) 幂等性:重复执行不应产生重复绑定
---    期望:0 行
-SELECT UserId, RoleId, COUNT(*) AS dup
-FROM SysUserRole
-WHERE UserId = (SELECT Id FROM SysUser WHERE Account = 'UATAdminA')
-GROUP BY UserId, RoleId
-HAVING COUNT(*) > 1;
+-- 3) 幂等性:不存在重复绑定(重复执行本脚本不产生第二条相同 UserId+RoleId)
+SELECT IF(
+  (SELECT COUNT(*) FROM (
+     SELECT ur.UserId, ur.RoleId
+       FROM SysUserRole ur
+       JOIN SysUser u ON u.Id = ur.UserId
+      WHERE u.Account = 'UATAdminA'
+      GROUP BY ur.UserId, ur.RoleId
+     HAVING COUNT(*) > 1
+   ) dup) = 0,
+  1, 0
+) AS ok_no_duplicate;