如何让我的关于不恰当单词的 sql 触发器起作用

Posted

技术标签:

【中文标题】如何让我的关于不恰当单词的 sql 触发器起作用【英文标题】:How can I make my sql trigger about inappropiate words work 【发布时间】:2021-08-20 19:19:57 【问题描述】:

我有一个包含不同表格的数据库,用于存储照片、用户、评论、评级...我想确认没有人在照片的标题或描述中使用“坏词”(侮辱)。 所以我决定创建一个名为“inapppropiatewords”的表,所有这些坏词都将存储在其中,然后我做了以下触发器:

DELIMITER //
CREATE OR REPLACE TRIGGER tBadWords_RNC02
    BEFORE INSERT ON Photos
    FOR EACH ROW
    BEGIN
        DECLARE numwords INT;
        SET numwords = (SELECT COUNT(*) FROM inappropiatewords);
        DECLARE title VARCHAR(128);
        DECLARE description VARCHAR(512);
        SET title = (SELECT title FROM Photos WHERE photoId = new.photoId);
        SET description = (SELECT description FROM Photos WHERE photoId = new.photoId);
        DECLARE x INT;
        SET x = 1;
        WHILE x <= numwords DO
            DECLARE word VARCHAR(200);
            SET word = (SELECT word FROM inappropiatewords WHERE inappropiateWordId = x);
            IF(INSTR(title,word) > 0 OR INSTR(description,word) > 0) THEN
                SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'You cannot use inappropiate words in title or description';
            END IF;
    END //
DELIMITER ;

但是当我尝试运行它时,我收到以下错误: [错误图片][1]

我不知道我做错了什么,所以如果有人可以帮助我,我将不胜感激。我正在使用 HeidiSQL 和 MariaDB。 [1]:https://i.stack.imgur.com/FFc6a.jpg

更新 我做了以下更改:

DELIMITER //
CREATE OR REPLACE TRIGGER tBadWords_RNC02
    BEFORE INSERT ON Photos
    FOR EACH ROW
    BEGIN
        DECLARE numwords INT;
        SET numwords = (SELECT COUNT(*) FROM inappropiatewords);
        FOR x IN 1..numwords DO
            DECLARE word VARCHAR(200);
            SET word = (SELECT word FROM inappropiatewords WHERE inappropiateWordId = x);
            IF(INSTR(NEW.title,word) > 0 OR INSTR(NEW.description,word) > 0) THEN
                SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'You cannot use inappropiate words in title or description';
            END IF;
    END //
DELIMITER ;

但我仍然收到错误:(

【问题讨论】:

FOR EACH ROW 触发器中,您不会从表中选择访问要插入的行。直接使用NEW.descriptionNEW.Title @Serg 我仍然在 WHILE 循环中遇到错误 “想要”是一个不恰当的词吗?如果没有,那么也许重新考虑一下这个列表。 【参考方案1】:

可以简单一点

DELIMITER //
CREATE OR REPLACE TRIGGER tBadWords_RNC02
    BEFORE INSERT ON Photos
    FOR EACH ROW
    BEGIN
       IF (EXISTS (
            SELECT 1 
            FROM inappropiatewords bw
            WHERE INSTR(NEW.title, bw.word) > 0 OR INSTR(NEW.description,  bw.word) > 0
          ))
       THEN
         SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'You cannot use inappropiate words in title or description';
       END IF;
END //
DELIMITER ;

db<>fiddle

【讨论】:

以上是关于如何让我的关于不恰当单词的 sql 触发器起作用的主要内容,如果未能解决你的问题,请参考以下文章

从邮递员推送数据时,sql触发器不起作用

sql触发器确保约会之间的30天不起作用

更新触发器后 SQL Server 不起作用

我在 SQL Plus 中创建了触发器而没有错误,但它不起作用

SQL SELECT 字段包含(单词)不起作用

为啥我的 WPF PasswordBox 样式触发器不起作用?