:setvar JudgeDJPassword "__REQUIRED__" :setvar JudgePPassword "__REQUIRED__" :setvar JudgeTPassword "__REQUIRED__" SET XACT_ABORT ON; BEGIN TRANSACTION; IF N'$(JudgeDJPassword)' = N'__REQUIRED__' OR N'$(JudgePPassword)' = N'__REQUIRED__' OR N'$(JudgeTPassword)' = N'__REQUIRED__' THROW 51000, N'请通过 sqlcmd -v 提供 JudgeDJPassword、JudgePPassword 和 JudgeTPassword。', 1; -- 本脚本只适用于当前 QA 赛事及场次;基础档案不匹配时立即停止,避免误改其他环境。 IF NOT EXISTS (SELECT 1 FROM dbo.Referee WHERE Id = 9001 AND Mobile = '13800000001' AND DeleteMark = 0) OR NOT EXISTS (SELECT 1 FROM dbo.Referee WHERE Id = 9002 AND Mobile = '13800000002' AND DeleteMark = 0) OR NOT EXISTS (SELECT 1 FROM dbo.Referee WHERE Id = 9003 AND Mobile = '13800000003' AND DeleteMark = 0) THROW 51001, N'现有裁判档案与预期不一致,已停止账号换绑。', 1; IF NOT EXISTS (SELECT 1 FROM dbo.EventSession WHERE Id = 468424868974597 AND EventId = 466884260081669 AND DeleteMark = 0) THROW 51002, N'目标赛事场次不存在,已停止账号换绑。', 1; DECLARE @Accounts TABLE ( UserId BIGINT NOT NULL, RefereeId BIGINT NOT NULL, EventRefereeId BIGINT NOT NULL, AssignmentId BIGINT NOT NULL, Name VARCHAR(64) NOT NULL, Mobile VARCHAR(20) NOT NULL, RoleMask INT NOT NULL, JudgeRole VARCHAR(32) NOT NULL, JudgeRoleType VARCHAR(16) NOT NULL, PasswordPrefix VARCHAR(16) NOT NULL, PlainPassword VARCHAR(64) NOT NULL ); INSERT INTO @Accounts VALUES (9001, 9001, 8001, 9101, '张裁判', '13800000001', 4, 'DJ1', 'DJ', 'LNL3', '$(JudgeDJPassword)'), (9002, 9002, 8002, 9102, '李裁判', '13800000002', 2, 'P1', 'P', 'oP76', '$(JudgePPassword)'), (9003, 9003, 8003, 9103, '王裁判', '13800000003', 1, 'T', 'T', 'PdYK', '$(JudgeTPassword)'); -- 使用应用现有的 Hashids(id)+MD5(password) 规则生成登录密码,密码本身不固化在仓库。 MERGE dbo.AppUser AS target USING @Accounts AS source ON target.Id = source.UserId WHEN MATCHED THEN UPDATE SET target.Name = source.Name, target.Mobile = source.Mobile, target.Password = LOWER(CONVERT(VARCHAR(32), HASHBYTES('MD5', source.PasswordPrefix + source.PlainPassword), 2)), target.MiniProgramRole = 2, target.AuditStatus = 2, target.Status = 0, target.DeleteMark = 0, target.UpdatedUserId = 0, target.UpdatedTime = GETDATE() WHEN NOT MATCHED THEN INSERT (Id, Name, Gender, Mobile, AuditStatus, Status, DeleteMark, CreatedUserId, CreatedTime, PersonType, Password, AuthType, MiniProgramRole, AuditTime, Remark) VALUES (source.UserId, source.Name, 0, source.Mobile, 2, 0, 0, 0, GETDATE(), 0, LOWER(CONVERT(VARCHAR(32), HASHBYTES('MD5', source.PasswordPrefix + source.PlainPassword), 2)), 0, 2, GETDATE(), N'裁判端正式联调账号'); UPDATE referee SET referee.AppUserId = account.UserId, referee.Roles = account.RoleMask, referee.AuditStatus = 2, referee.Status = 0, referee.DeleteMark = 0, referee.UpdatedUserId = 0, referee.UpdatedTime = GETDATE() FROM dbo.Referee referee INNER JOIN @Accounts account ON account.RefereeId = referee.Id; UPDATE eventReferee SET eventReferee.Status = 0, eventReferee.DeleteMark = 0, eventReferee.UpdatedUserId = 0, eventReferee.UpdatedTime = GETDATE() FROM dbo.EventReferee eventReferee INNER JOIN @Accounts account ON account.EventRefereeId = eventReferee.Id WHERE eventReferee.EventId = 466884260081669; -- 旧联调席位只停用,不改写旧评分单和任务,历史数据仍可追溯且不会串到新账号。 UPDATE assignment SET assignment.AssignmentStatus = 9, assignment.Status = 1, assignment.SubmittedTime = NULL, assignment.Remark = N'已由正式裁判账号换绑,旧联调席位停用', assignment.UpdatedUserId = 0, assignment.UpdatedTime = GETDATE() FROM dbo.EventJudgeAssignment assignment INNER JOIN dbo.AppUser appUser ON appUser.Id = assignment.JudgeUserId WHERE assignment.SessionId = 468424868974597 AND appUser.Mobile IN ('19900000001', '19900000002', '19900000003') AND assignment.DeleteMark = 0; MERGE dbo.EventJudgeAssignment AS target USING @Accounts AS source ON target.Id = source.AssignmentId WHEN MATCHED THEN UPDATE SET target.EventId = 466884260081669, target.SessionId = 468424868974597, target.EventRefereeId = source.EventRefereeId, target.RefereeId = source.RefereeId, target.JudgeUserId = source.UserId, target.JudgeRole = source.JudgeRole, target.JudgeRoleType = source.JudgeRoleType, target.AssignmentStatus = 1, target.Status = 0, target.DeleteMark = 0, target.SubmittedTime = GETDATE(), target.Remark = N'裁判端正式联调席位', target.UpdatedUserId = 0, target.UpdatedTime = GETDATE() WHEN NOT MATCHED THEN INSERT (Id, EventId, SessionId, EventRefereeId, RefereeId, JudgeUserId, JudgeRole, JudgeRoleType, AssignmentStatus, SubmittedTime, Remark, Status, DeleteMark, CreatedUserId, CreatedTime) VALUES (source.AssignmentId, 466884260081669, 468424868974597, source.EventRefereeId, source.RefereeId, source.UserId, source.JudgeRole, source.JudgeRoleType, 1, GETDATE(), N'裁判端正式联调席位', 0, 0, 0, GETDATE()); -- 联调账号做可恢复的软删除;关联的旧草稿、任务和评分单不物理删除。 UPDATE eventReferee SET eventReferee.Status = 1, eventReferee.DeleteMark = 1, eventReferee.UpdatedUserId = 0, eventReferee.UpdatedTime = GETDATE() FROM dbo.EventReferee eventReferee INNER JOIN dbo.Referee referee ON referee.Id = eventReferee.RefereeId WHERE referee.Mobile IN ('19900000001', '19900000002', '19900000003'); UPDATE dbo.Referee SET Status = 1, DeleteMark = 1, UpdatedUserId = 0, UpdatedTime = GETDATE() WHERE Mobile IN ('19900000001', '19900000002', '19900000003'); UPDATE dbo.AppUser SET Status = 1, DeleteMark = 1, UpdatedUserId = 0, UpdatedTime = GETDATE() WHERE Mobile IN ('19900000001', '19900000002', '19900000003'); COMMIT TRANSACTION;