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 中编写可以从触发器和存储函数调用的信号函数?

mysql:向 php 发送 sqlstate 信号

QT QTcpServer newConnection 信号无法触发 槽

QT QTcpServer newConnection 信号无法触发 槽

gps信号转发器的功能特点和使用方法

MYSQL 更新触发器 - 无法更新存储函数/触发器中的表,因为它已被语句使用