MariaDB不允许正确使用SIGNAL

可能与之相关:MySQL trigger definition - 1064 error

嗨,

我正在尝试在MariaDB 10.4.10-GA中的用户表上添加触发器。目的是,用户可以设置第二个邮件地址,但是该邮件地址不能与第一个邮件地址相同。给定触发器的代码:

CREATE TRIGGER MyValidator
  BEFORE INSERT
  ON User
  FOR EACH ROW
BEGIN
  IF NEW.U_Mail LIKE '%_@%_.%' THEN
    IF NEW.U_AlternateMail LIKE NEW.U_Mail THEN
      SIGNAL SQLSTATE VALUE '45001'
      SET MESSAGE_TEXT = 'User - Mail already set';
    ELSEIF NEW.U_AlternateMail NOT LIKE '%_@%_.%' THEN
      SIGNAL SQLSTATE VALUE '45002'
      SET MESSAGE_TEXT = 'User - Not a Mail';
    END IF;
  ELSE
    SIGNAL SQLSTATE VALUE '45000'
    SET MESSAGE_TEXT = 'User - Bad Mail in database';
  END IF;
END;

MariaDB告诉我:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 9

这将是SET语句。甚至只是在SET testvar="text";之后添加BEGIN。产生相同的错误,只是将新行作为错误行。 我已经在服务器上坐了好几个小时了,在互联网上找不到任何有用的东西。 根据文档,此SQL代码应该正确:https://mariadb.com/kb/en/library/signal/ 相互重置,上述链接中的示例代码也无法解决相同的错误:

CREATE PROCEDURE test_error(x INT)
BEGIN
   DeclARE errno SMALLINT UNSIGNED DEFAULT 31001;
   SET @errmsg = 'Hello,world!';
   IF x = 1 THEN
      SIGNAL SQLSTATE '45000' SET
      MYSQL_ERRNO = errno,MESSAGE_TEXT = @errmsg;
   ELSE
      SIGNAL SQLSTATE '45000' SET
      MYSQL_ERRNO = errno,MESSAGE_TEXT = _utf8'Hello,world!';
   END IF;
END;

任何想法,可能是什么问题?

问候

danny8392 回答:MariaDB不允许正确使用SIGNAL

在添加触发器,函数或存储过程定义时,请确保使用delimiter

不确定使用的是命令行工具还是其他工具,例如工作台或phpmyadmin,但这两种方法都是相同的。

我用定界符将您的触发语句粘贴到了命令行中:

delimiter //
CREATE TRIGGER MyValidator
  BEFORE INSERT
  ON User
  FOR EACH ROW
BEGIN
  IF NEW.U_Mail LIKE '%_@%_.%' THEN
    IF NEW.U_AlternateMail LIKE NEW.U_Mail THEN
      SIGNAL SQLSTATE VALUE '45001'
      SET MESSAGE_TEXT = 'User - Mail already set';
    ELSEIF NEW.U_AlternateMail NOT LIKE '%_@%_.%' THEN
      SIGNAL SQLSTATE VALUE '45002'
      SET MESSAGE_TEXT = 'User - Not a Mail';
    END IF;
  ELSE
    SIGNAL SQLSTATE VALUE '45000'
    SET MESSAGE_TEXT = 'User - Bad Mail in database';
  END IF;
END;
//

运行时(首先更改为数据库后),输出为:

MariaDB [(none)]> use test
Database changed
MariaDB [test]> delimiter //
MariaDB [test]> CREATE TRIGGER MyValidator
    ->   BEFORE INSERT
    ->   ON User
    ->   FOR EACH ROW
    -> BEGIN
    ->   IF NEW.U_Mail LIKE '%_@%_.%' THEN
    ->     IF NEW.U_AlternateMail LIKE NEW.U_Mail THEN
    ->       SIGNAL SQLSTATE VALUE '45001'
    ->       SET MESSAGE_TEXT = 'User - Mail already set';
    ->     ELSEIF NEW.U_AlternateMail NOT LIKE '%_@%_.%' THEN
    ->       SIGNAL SQLSTATE VALUE '45002'
    ->       SET MESSAGE_TEXT = 'User - Not a Mail';
    ->     END IF;
    ->   ELSE
    ->     SIGNAL SQLSTATE VALUE '45000'
    ->     SET MESSAGE_TEXT = 'User - Bad Mail in database';
    ->   END IF;
    -> END;
    -> //
Query OK,0 rows affected (0.11 sec)

...,然后再检查information_schema:

MariaDB [test]> select trigger_schema,event_object_table,action_timing,action_statement from information_schema.triggers where trigger_name = 'MyValidator' \G
*************************** 1. row ***************************
    trigger_schema: test
event_object_table: user
     action_timing: BEFORE
  action_statement: BEGIN
  IF NEW.U_Mail LIKE '%_@%_.%' THEN
    IF NEW.U_AlternateMail LIKE NEW.U_Mail THEN
      SIGNAL SQLSTATE VALUE '45001'
      SET MESSAGE_TEXT = 'User - Mail already set';
    ELSEIF NEW.U_AlternateMail NOT LIKE '%_@%_.%' THEN
      SIGNAL SQLSTATE VALUE '45002'
      SET MESSAGE_TEXT = 'User - Not a Mail';
    END IF;
  ELSE
    SIGNAL SQLSTATE VALUE '45000'
    SET MESSAGE_TEXT = 'User - Bad Mail in database';
  END IF;
END
1 row in set (0.01 sec)
本文链接:https://www.f2er.com/2940139.html

大家都在问