fix: make ERP exception menu SQL Server 2016 safe

This commit is contained in:
zgw
2026-09-15 17:38:35 +08:00
parent 67251a7562
commit 2632a57d73
2 changed files with 33 additions and 11 deletions

View File

@@ -31,6 +31,23 @@ class ShadowV3OperationsPackageTest {
.isRegularFile();
}
@Test
void erpPushExceptionMenuUsesIdentityGeneratedKeys() throws IOException {
String script = text("sql/upgrade-erp-push-exception-menu.sql");
assertThat(script).contains("SCOPE_IDENTITY()");
assertThat(script).doesNotContain("MAX(menu_id)", "(menu_id, menu_name");
}
@Test
void erpPushExceptionMenuIsAsciiSafeForSqlcmd13() throws IOException {
byte[] script = Files.readAllBytes(root.resolve("sql/upgrade-erp-push-exception-menu.sql"));
for (byte value : script) {
assertThat(value & 0x80).as("SQL script byte must be ASCII").isZero();
}
}
@Test
void preflightIsReadOnlyAndChecksExactSourceAndSingleProcess() throws IOException {
String script = text("scripts/shadow-v3-preflight.cmd");

View File

@@ -7,6 +7,11 @@ DECLARE @menu_id bigint;
DECLARE @retry_id bigint;
DECLARE @source_menu_id bigint;
DECLARE @lock_result int;
DECLARE @lock_error nvarchar(2048) = CONVERT(nvarchar(2048), 0xE065D56CB783D65320004500520050002000A8630190025F385EDC8355534753A77E0195);
DECLARE @menu_name nvarchar(255) = CONVERT(nvarchar(255), 0x450052005000A8630190025F385E);
DECLARE @menu_remark nvarchar(500) = CONVERT(nvarchar(500), 0x450052005000DE56204F3159258D17526888);
DECLARE @retry_name nvarchar(255) = CONVERT(nvarchar(255), 0x450052005000025F385ECD91A863);
DECLARE @retry_remark nvarchar(500) = CONVERT(nvarchar(500), 0x3159258D55536E63CD91B065A0526551450052005000DE56204F1F961752);
EXEC @lock_result = sys.sp_getapplock
@Resource = N'FT546WMS:upgrade-erp-push-exception-menu',
@@ -17,7 +22,7 @@ EXEC @lock_result = sys.sp_getapplock
IF @lock_result < 0
BEGIN
ROLLBACK TRANSACTION;
THROW 51000, N'无法获取 ERP 推送异常菜单升级锁', 1;
THROW 51000, @lock_error, 1;
END;
SELECT TOP (1) @menu_id = menu_id
@@ -27,16 +32,16 @@ ORDER BY menu_id;
IF @menu_id IS NULL
BEGIN
SELECT @menu_id = ISNULL(MAX(menu_id), 0) + 1 FROM dbo.sys_menu WITH (UPDLOCK, HOLDLOCK);
INSERT INTO dbo.sys_menu
(menu_id, menu_name, parent_id, order_num, path, component, query, route_name,
(menu_name, parent_id, order_num, path, component, query, route_name,
is_frame, is_cache, menu_type, visible, status, perms, icon,
create_by, create_time, update_by, update_time, remark)
VALUES
(@menu_id, N'ERP推送异常', 2, 2, N'pushException', N'erp/pushException/index', NULL, N'',
(@menu_name, 2, 2, N'pushException', N'erp/pushException/index', NULL, N'',
N'1', N'0', N'C', N'0', N'0', N'erp:pushException:list', N'warning',
N'admin', SYSDATETIME(), N'', NULL, N'ERP回传失败列表');
N'admin', SYSDATETIME(), N'', NULL, @menu_remark);
SET @menu_id = CONVERT(bigint, SCOPE_IDENTITY());
END;
SELECT TOP (1) @retry_id = menu_id
@@ -46,16 +51,16 @@ ORDER BY menu_id;
IF @retry_id IS NULL
BEGIN
SELECT @retry_id = ISNULL(MAX(menu_id), 0) + 1 FROM dbo.sys_menu WITH (UPDLOCK, HOLDLOCK);
INSERT INTO dbo.sys_menu
(menu_id, menu_name, parent_id, order_num, path, component, query, route_name,
(menu_name, parent_id, order_num, path, component, query, route_name,
is_frame, is_cache, menu_type, visible, status, perms, icon,
create_by, create_time, update_by, update_time, remark)
VALUES
(@retry_id, N'ERP异常重推', @menu_id, 1, N'#', N'', NULL, N'',
(@retry_name, @menu_id, 1, N'#', N'', NULL, N'',
N'1', N'0', N'F', N'0', N'0', N'erp:pushException:retry', N'#',
N'admin', SYSDATETIME(), N'', NULL, N'失败单据重新加入ERP回传队列');
N'admin', SYSDATETIME(), N'', NULL, @retry_remark);
SET @retry_id = CONVERT(bigint, SCOPE_IDENTITY());
END;
SELECT TOP (1) @source_menu_id = menu_id