示例

把tb_policy的某些数据migration到新表中

  1. DELIMITER $$
  2. USE `hesui`$$
  3. start transaction$$
  4. DROP PROCEDURE if EXISTS proc_sender_exception_migration$$
  5. CREATE PROCEDURE proc_sender_exception_migration()
  6. BEGIN
  7. DECLARE splitChar VARCHAR(2) DEFAULT ';';
  8. DECLARE tmp VARCHAR(255) DEFAULT '';
  9. DECLARE cnt INT DEFAULT 0;
  10. DECLARE i INT DEFAULT 0;
  11. DECLARE p_id INT DEFAULT 0;
  12. DECLARE s_except LONGTEXT DEFAULT '';
  13. DECLARE done INT DEFAULT 0;
  14. DECLARE sender_except_cursor CURSOR
  15. FOR
  16. SELECT policy_id, sender_except
  17. FROM tb_policy
  18. WHERE sender_except IS NOT NULL
  19. AND sender_except != '';
  20. DECLARE continue handler FOR NOT FOUND SET done = 1;
  21. OPEN sender_except_cursor;
  22. start_loop: loop
  23. fetch sender_except_cursor INTO p_id, s_except;
  24. if done = 1 then
  25. leave start_loop;
  26. END if;
  27. SET cnt = 1+(LENGTH(s_except) - LENGTH(REPLACE(s_except,splitChar,'')));
  28. SET i = 0;
  29. while i < cnt do
  30. SET i = i + 1;
  31. SET tmp = reverse(substring_index(reverse(substring_index(s_except,splitChar,i)),splitChar,1));
  32. if tmp IS NOT NULL OR tmp != '' then
  33. INSERT INTO tb_policy_target_exception(policy_id, sender_except, rcpt_except) VALUES (p_id, tmp, '*');
  34. END if;
  35. END while;
  36. END loop;
  37. END$$
  38. call proc_sender_exception_migration();$$
  39. DROP PROCEDURE if EXISTS proc_rcpt_exception_migration$$
  40. CREATE PROCEDURE proc_rcpt_exception_migration()
  41. BEGIN
  42. DECLARE splitChar VARCHAR(2) DEFAULT ';';
  43. DECLARE tmp VARCHAR(255) DEFAULT '';
  44. DECLARE cnt INT DEFAULT 0;
  45. DECLARE i INT DEFAULT 0;
  46. DECLARE p_id INT DEFAULT 0;
  47. DECLARE r_except LONGTEXT DEFAULT '';
  48. DECLARE done INT DEFAULT 0;
  49. DECLARE rcpt_except_cursor CURSOR
  50. FOR
  51. SELECT policy_id, rcpt_except
  52. FROM tb_policy
  53. WHERE rcpt_except IS NOT NULL
  54. AND rcpt_except != '';
  55. DECLARE continue handler FOR NOT FOUND SET done = 1;
  56. OPEN rcpt_except_cursor;
  57. start_loop: loop
  58. fetch rcpt_except_cursor INTO p_id, r_except;
  59. if done = 1 then
  60. leave start_loop;
  61. END if;
  62. SET cnt = 1+(LENGTH(r_except) - LENGTH(REPLACE(r_except,splitChar,'')));
  63. SET i = 0;
  64. while i < cnt do
  65. SET i = i + 1;
  66. SET tmp = reverse(substring_index(reverse(substring_index(r_except,splitChar,i)),splitChar,1));
  67. if tmp IS NOT NULL OR tmp != '' then
  68. INSERT INTO tb_policy_target_exception(policy_id, sender_except, rcpt_except) VALUES (p_id, '*', tmp);
  69. END if;
  70. END while;
  71. END loop;
  72. END$$
  73. call proc_rcpt_exception_migration();$$
  74. drop procedure if exists group_policy_relation_migration$$
  75. CREATE procedure group_policy_relation_migration()
  76. BEGIN
  77. declare done INT DEFAULT 0;
  78. declare policy_id int(10);
  79. declare gpr_id int(10);
  80. DECLARE exception_id INT(10);
  81. declare gpr_cursor_rcpt CURSOR
  82. FOR
  83. select gpr.policy_id, gpr.id
  84. from tb_ldap_group_policy_relation gpr, tb_policy
  85. where gpr.policy_id = tb_policy.policy_id
  86. and gpr.include = 0
  87. and tb_policy.direction = 0;
  88. declare gpr_cursor_sender CURSOR
  89. FOR
  90. select gpr.policy_id, gpr.id
  91. from tb_ldap_group_policy_relation gpr, tb_policy
  92. where gpr.policy_id = tb_policy.policy_id
  93. and gpr.include = 0
  94. and tb_policy.direction = 1;
  95. declare CONTINUE HANDLER FOR NOT FOUND SET done = 1;
  96. open gpr_cursor_rcpt;
  97. start_loop : loop
  98. fetch gpr_cursor_rcpt into policy_id, gpr_id;
  99. if done=1 then
  100. leave start_loop;
  101. end if;
  102. insert into tb_policy_target_exception(policy_id, sender_except) values(policy_id, '*');
  103. select max(id) from tb_policy_target_exception into exception_id;
  104. update tb_ldap_group_policy_relation set exception_id = exception_id where id = gpr_id;
  105. end loop;
  106. open gpr_cursor_sender;
  107. start_loop : loop
  108. fetch gpr_cursor_sender into policy_id, gpr_id;
  109. if done=1 then
  110. leave start_loop;
  111. end if;
  112. insert into tb_policy_target_exception(policy_id, rcpt_except) values(policy_id, '*');
  113. select max(id) from tb_policy_target_exception into exception_id;
  114. update tb_ldap_group_policy_relation set exception_id = exception_id where id = gpr_id;
  115. end loop;
  116. END$$
  117. call group_policy_relation_migration();$$
  118. commit$$
  119. DELIMITER ;