触发器(trigger)示例

当向tb_policy插数据之后,或者删除数据之后,触发对应操作

  1. DELIMITER $$
  2. USE `hesui`$$
  3. START TRANSACTION$$
  4. DROP TRIGGER IF EXISTS trigger_after_tb_policy_insert $$
  5. CREATE TRIGGER trigger_after_tb_policy_insert AFTER INSERT ON tb_policy FOR EACH ROW
  6. BEGIN
  7. DECLARE splitChar VARCHAR(2) DEFAULT ';';
  8. DECLARE sender_except LONGTEXT DEFAULT '';
  9. DECLARE rcpt_except LONGTEXT DEFAULT '';
  10. DECLARE tmp VARCHAR(255) DEFAULT '';
  11. DECLARE cnt INT DEFAULT 0;
  12. DECLARE i INT DEFAULT 0;
  13. SET sender_except = NEW.sender_except;
  14. SET rcpt_except = NEW.rcpt_except;
  15. if sender_except IS NOT NULL AND sender_except != '' then
  16. SET cnt = 1+(LENGTH(sender_except) - LENGTH(REPLACE(sender_except,splitChar,'')));
  17. while i < cnt
  18. DO
  19. SET i = i + 1;
  20. SET tmp = reverse(substring_index(reverse(substring_index(sender_except,splitChar,i)),splitChar,1));
  21. if tmp IS NOT NULL AND tmp != '' then
  22. INSERT INTO tb_policy_target_exception(policy_id, sender_except, rcpt_except) VALUES (NEW.policy_id, tmp, '*');
  23. END if;
  24. END while;
  25. SET cnt = 0;
  26. SET i = 0;
  27. SET tmp = '';
  28. END if;
  29. if rcpt_except IS NOT NULL AND rcpt_except != '' then
  30. SET cnt = 1+(LENGTH(rcpt_except) - LENGTH(REPLACE(rcpt_except,splitChar,'')));
  31. while i < cnt
  32. DO
  33. SET i = i + 1;
  34. SET tmp = reverse(substring_index(reverse(substring_index(rcpt_except,splitChar,i)),splitChar,1));
  35. if tmp IS NOT NULL AND tmp != '' then
  36. INSERT INTO tb_policy_target_exception(policy_id, sender_except, rcpt_except) VALUES (NEW.policy_id, '*', tmp);
  37. END if;
  38. END while;
  39. SET cnt = 0;
  40. SET i = 0;
  41. SET tmp = '';
  42. END if;
  43. END$$
  44. DROP TRIGGER IF EXISTS trigger_after_tb_policy_delete $$
  45. CREATE TRIGGER trigger_after_tb_policy_delete AFTER DELETE ON tb_policy FOR EACH ROW
  46. BEGIN
  47. DELETE FROM tb_ldap_group_policy_relation WHERE policy_id = OLD.policy_id;
  48. DELETE FROM tb_policy_target_exception WHERE policy_id = OLD.policy_id;
  49. END$$
  50. DROP TRIGGER IF EXISTS trigger_before_tb_ldap_group_policy_relation_insert $$
  51. CREATE TRIGGER trigger_before_tb_ldap_group_policy_relation_insert BEFORE INSERT ON tb_ldap_group_policy_relation FOR EACH ROW
  52. BEGIN
  53. DECLARE exception_id INT DEFAULT 0;
  54. DECLARE direction INT DEFAULT 0;
  55. if NEW.exception_id IS NULL and NEW.include = 0 then
  56. SELECT direction FROM tb_policy WHERE policy_id = NEW.policy_id INTO direction;
  57. if direction = 0 then
  58. INSERT INTO tb_policy_target_exception(policy_id, sender_except) VALUES (NEW.policy_id, '*');
  59. ELSE
  60. INSERT INTO tb_policy_target_exception(policy_id, rcpt_except) VALUES (NEW.policy_id, '*');
  61. END if;
  62. SELECT MAX(id) FROM tb_policy_target_exception INTO exception_id;
  63. SET NEW.exception_id = exception_id;
  64. END if;
  65. END$$
  66. COMMIT$$
  67. DELIMITER ;