我怎样才能让我的 sql 触发关于不恰当的词的工作
How can I make my sql trigger about inappropiate words work
我有一个包含不同 table 的数据库,用于存储照片、用户、评论、评分...我想验证没有人在他们的照片标题中使用“脏话”(侮辱)或说明。
所以我决定创建一个名为 'inappropiatewords' 的 table 来存储所有这些坏词,然后我创建了以下触发器:
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 ;
但我仍然遇到错误:(
可以简单一点
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 ;
我有一个包含不同 table 的数据库,用于存储照片、用户、评论、评分...我想验证没有人在他们的照片标题中使用“脏话”(侮辱)或说明。 所以我决定创建一个名为 'inappropiatewords' 的 table 来存储所有这些坏词,然后我创建了以下触发器:
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 ;
但我仍然遇到错误:(
可以简单一点
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 ;