Как я могу заставить работать мой sql-триггер о неподходящих словах

#mysql #sql #database #triggers #mariadb

Вопрос:

У меня есть база данных с различными таблицами для хранения фотографий, пользователей, отзывов, оценок… Я хочу убедиться, что никто не использует «плохие слова» (оскорбления) в названии или описании своих фотографий. Поэтому я решил создать таблицу под названием «неподходящие слова», в которой будут храниться все эти плохие слова, а затем я сделал следующий триггер:

 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 ;
 

но я все еще получаю сообщение об ошибке 🙁

Комментарии:

1. В FOR EACH ROW триггере вы не выбираете из таблицы доступ к вставляемой строке. Используйте NEW.description и NEW.Title непосредственно.

2. @Serg Я все еще получаю ошибку в цикле WHILE

3. «Хочешь» — неуместное слово? Если нет, то, возможно, пересмотрите список.

Ответ №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<>скрипка