【问题标题】:MySQL: Unable to use SIGNAL in TriggerMySQL:无法在触发器中使用信号
【发布时间】: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 版本。有什么建议吗?

【问题讨论】:

    标签: mysql sql database triggers signals


    【解决方案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$$
    

    作品

    【讨论】:

      猜你喜欢
      • 2013-12-19
      • 2017-11-17
      • 2018-10-07
      • 2015-02-26
      • 2013-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      相关资源
      最近更新 更多