使用包含count函数的where条件实现MySQL触发器

时间:2018-03-28 18:17:10

标签: mysql triggers

要求是实现一个触发器,该触发器在过去1小时内多次检查异常表以查找满足一组条件的条目。基本上我们不希望收到有关瞬时异常的警报。

这是我所拥有的;

CREATE TRIGGER trException AFTER INSERT ON Exception
 FOR EACH ROW
 BEGIN
  IF NEW.ExceptionMessage like '%The operation is timed out%' or 
    NEW.ExceptionMessage like '%https://....%' THEN
    INSERT INTO NotificationLog ('Message','InsertedTime') SELECT 'Time out error',now() 
    WHERE (SELECT COUNT(ExceptionId) FROM Exception 
           WHERE CreateTimestamp > NOW() - INTERVAL 1 HOUR 
           AND ExceptionMessage LIKE '%The operation has timed out%' 
           AND ExceptionMessage LIKE '%https://....%') > 10;
  ELSEIF NEW.ExceptionMessage like '%Error...%' THEN
            ...Next insert scenario with critria
  END IF;
END;

我认为问题是嵌入式SELECT语句中的计数。当它在insert语句之外运行时,代码工作正常。我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:0)

我已经解决了这个问题。通过添加一个表(ExceptionNotificationMessage)来保存通知消息,我能够将FROM子句添加到第一个SELECT语句并修复了问题。

CREATE TRIGGER trException AFTER INSERT ON Exception
 FOR EACH ROW
 BEGIN
  IF NEW.ExceptionMessage like '%The operation is timed out%' or 
    NEW.ExceptionMessage like '%https://....%' THEN
    INSERT INTO NotificationLog ('Message','InsertedTime') 
      SELECT 'Message','InsertedTime'
      **FROM ExceptionNotificationMessage** 
      WHERE (SELECT COUNT(ExceptionId) FROM Exception 
           WHERE CreateTimestamp > NOW() - INTERVAL 1 HOUR 
           AND ExceptionMessage LIKE '%The operation has timed out%' 
           AND ExceptionMessage LIKE '%https://....%') > 10;
  ELSEIF NEW.ExceptionMessage like '%Error...%' THEN
            ...Next insert scenario with criteria
  END IF;
END;

马丁