MySQL:无法在触发器中使用SIGNAL

问题描述 投票:3回答:2

我正在尝试使用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版本。有什么建议吗?

mysql sql database triggers signals
2个回答
5
投票

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 ; 

0
投票

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$$

Works

© www.soinside.com 2019 - 2024. All rights reserved.