#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 ;