0

目标:使用具有多个条件的触发器阻止插入数据库表

描述:试图阻止联系人表中的大量不相关条目。我创建了一个包含很多坏/脏话/脏话的亵渎表和一个正则表达式过滤 URL。如果任何条目带有这些坏词或 URL,则不应插入 DB。

分析:在 SO 上搜索了许多不同的解决方案,可能是重复的,但没有找到在单个触发条件中具有多个条件和正则表达式的任何答案。此外,无法使用这些答案创建成功的触发器。在创建时,它会抛出错误。请帮助,提前谢谢。

表格列 电子邮件、消息

扳机

DELIMITER $$
CREATE TRIGGER trg_contact_insert_profanity_check
BEFORE INSERT ON contacts.c
FOR EACH ROW
BEGIN
IF (c.email,c.message IN (SELECT * FROM profanity) OR (c.message REGEXP '/(http|https|ftp|ftps)?(\:\/\/)?[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/' ))
THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = "Database Error: BAD REQUEST";
ENDIF;
END;$$

错误

    MySQL said: Documentation

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'as c
FOR EACH ROW
BEGIN
IF (c.email,c.message IN (SELECT * FROM profanity) OR' at line 2
4

1 回答 1

0

在调试了很多可能性并挖掘了 SO 答案之后,终于得到了触发器的最终和正确版本。期待快速响应,因为这不是其他开发人员无法破解的 SCI-FI 问题。

错误一:之间有空格ENDIF。应该是END IF

错误2:触发器定义缺失new.column

正确版本

CREATE TRIGGER `trg_contact_insert_profanity_check` BEFORE INSERT ON `contacts`
 FOR EACH ROW BEGIN
IF ((new.email IN (SELECT word FROM profanity)) OR (new.message
 IN (SELECT word FROM profanity)) OR (new.message REGEXP '/(http|https|ftp|ftps)?(://)?[a-zA-Z0-9-.]+.[a-zA-Z]{2,3}(/S*)?/' ))
THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = "Database Error: BAD REQUEST";
END IF;
END
于 2019-07-26T19:16:51.693 回答