MySQL:无法在触发器中使用信号
Posted
技术标签:
【中文标题】MySQL:无法在触发器中使用信号【英文标题】:MySQL: Unable to use SIGNAL in Trigger 【发布时间】:2014-11-29 10:54:33 【问题描述】:我正在尝试使用 mysql 触发器生成错误消息。以下是我的代码:
DELIMITER $$
CREATE TRIGGER `test_before_insert` BEFORE INSERT ON `Initial_Fees`
FOR EACH ROW
BEGIN
IF ((SELECT Activation from Portfolio WHERE idPortfolio = New.idPortfolio)=false) THEN
SIGNAL SQLSTATE '45000';
SET MESSAGE_TEXT := 'Disabled Thing';
END IF;
END$$
DELIMITER ;
但这总是会产生错误。我不知道错误是什么,因为它没有说明错误,它只是“错误”。
请问有什么建议吗?除此之外,有人说使用SIGNAL
会遇到问题,因为它可能取决于 MySQL 版本。有什么建议吗?
【问题讨论】:
【参考方案1】:set message_text
子句是信号语法的一部分——它们之间不应有分号 (;
)。
此外,它使用=
运算符,而不是:=
:
DELIMITER $$
CREATE TRIGGER `test_before_insert` BEFORE INSERT ON `Initial_Fees`
FOR EACH ROW
BEGIN
IF ((SELECT Activation from Portfolio WHERE idPortfolio = New.idPortfolio)=false) THEN
SIGNAL SQLSTATE '45000' -- Note: no semicolon
SET MESSAGE_TEXT = 'Disabled Thing'; -- Note the = operator
END IF;
END$$
DELIMITER ;
【讨论】:
我在 MySQL Work bench 中添加了这段代码并导出了 sql 文件,一切顺利!我不知道 php MyAdmin 发生了什么。谢谢!【参考方案2】:PHPMyAdmin 让您可以选择指定您在 SQL 中使用的分隔符。
我指定$$
作为分隔符而不是;
但是Mysql 在某些地方仍然期待;
。所以
CREATE TRIGGER trg_update_wp_posts BEFORE UPDATE ON wp_posts
FOR EACH ROW
IF (NEW.post_content LIKE '%<script%>%') THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Script not allowed in post';
END IF;
失败
但是
CREATE TRIGGER trg_update_wp_posts BEFORE UPDATE ON wp_posts
FOR EACH ROW
IF (NEW.post_content LIKE '%<script%>%') THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Script not allowed in post';
END IF$$
作品
【讨论】:
以上是关于MySQL:无法在触发器中使用信号的主要内容,如果未能解决你的问题,请参考以下文章
如何在 MYSQL 中编写可以从触发器和存储函数调用的信号函数?
QT QTcpServer newConnection 信号无法触发 槽