programing

MariaDB에서 SIGNAL을 제대로 사용할 수 없음

jooyons 2023. 9. 12. 20:00
반응형

MariaDB에서 SIGNAL을 제대로 사용할 수 없음

관련이 있을 가능성:MySQL 트리거 정의 - 1064 오류

안녕하세요.

MariaDB 10.4.10-GA의 User-Table에 트리거를 추가하려고 합니다.사용자는 두 번째 메일 주소를 설정할 수 있지만, 메일 주소가 첫 번째 메일 주소와 같지 않아야 합니다.주어진 트리거에 대한 코드:

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진술.그리고 심지어는 그냥 a를 추가하는 것 조차도SET testvar="text";끝나고BEGIN. 해당 새 선을 오류가 있는 선과만 동일한 오류를 산출합니다.저는 몇 시간 동안 그 문제에 대해 논의해 왔지만 인터넷에서 유용한 것을 찾을 수 없었습니다.문서에 따르면 이 SQL-Code는 정확해야 합니다. 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;

무슨 생각 있어요? 무슨 일 때문에 그러시죠?

인사말

사용해야 합니다.delimiter트리거, 함수 또는 저장 프로시저 정의를 추가하는 경우.

명령줄이나 workbench나 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_graphics를 확인합니다.

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)

언급URL : https://stackoverflow.com/questions/59290075/mariadb-not-allowing-to-use-signal-properly

반응형