grant_wechat_notify_menu_to_all_roles.sql 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. -- 将「开启微信通知」(OA007) 授予全部未删除角色
  2. -- 前置:已执行 docs/sql/mobile_menu_oa_wechat_notify.sql(菜单须已存在)
  3. -- 幂等:可重复执行;已有有效授权跳过;软删则恢复
  4. -- 说明:
  5. -- 1) 用户变量显式 utf8mb4_unicode_ci,避免 collation 混用报错 1267
  6. -- 2) 主键用 MD5(role_id|menu_id),避免 INSERT…SELECT 中 UUID() 只算一次导致重复主键
  7. SET @menu_id = CONVERT('MINI000000000000000000000000OA007' USING utf8mb4) COLLATE utf8mb4_unicode_ci;
  8. SET @tenant_no = CONVERT('zkxw' USING utf8mb4) COLLATE utf8mb4_unicode_ci;
  9. -- 1) 恢复历史上已软删的授权(按 role_id + menu_id)
  10. UPDATE sys_role_menu rm
  11. INNER JOIN sys_role r
  12. ON r.id COLLATE utf8mb4_unicode_ci = rm.role_id COLLATE utf8mb4_unicode_ci
  13. AND r.del_flag = 0
  14. AND r.tenant_no COLLATE utf8mb4_unicode_ci = @tenant_no
  15. SET
  16. rm.del_flag = 0,
  17. rm.update_time = NOW(),
  18. rm.remark = 'grant wechat-notify to all roles'
  19. WHERE rm.menu_id COLLATE utf8mb4_unicode_ci = @menu_id
  20. AND rm.tenant_no COLLATE utf8mb4_unicode_ci = @tenant_no
  21. AND rm.del_flag = 1;
  22. -- 2) 为尚未关联该菜单的角色新增授权
  23. INSERT INTO sys_role_menu (
  24. id, role_id, menu_id, tenant_no, order_num, remark,
  25. create_by, create_dept_id, create_time, update_by, update_time, del_flag
  26. )
  27. SELECT
  28. UPPER(MD5(CONCAT(r.id, '|', @menu_id))),
  29. r.id,
  30. @menu_id,
  31. @tenant_no,
  32. 0,
  33. 'grant wechat-notify to all roles',
  34. 'admin',
  35. '',
  36. NOW(),
  37. NULL,
  38. NOW(),
  39. 0
  40. FROM sys_role r
  41. WHERE r.del_flag = 0
  42. AND r.tenant_no COLLATE utf8mb4_unicode_ci = @tenant_no
  43. AND EXISTS (
  44. SELECT 1 FROM sys_menu m
  45. WHERE m.id COLLATE utf8mb4_unicode_ci = @menu_id
  46. AND m.del_flag = 0
  47. )
  48. AND NOT EXISTS (
  49. SELECT 1 FROM sys_role_menu rm
  50. WHERE rm.role_id COLLATE utf8mb4_unicode_ci = r.id COLLATE utf8mb4_unicode_ci
  51. AND rm.menu_id COLLATE utf8mb4_unicode_ci = @menu_id
  52. AND rm.tenant_no COLLATE utf8mb4_unicode_ci = @tenant_no
  53. AND rm.del_flag = 0
  54. );