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
'programing' 카테고리의 다른 글
| 워드프레스(프론트엔드)의 대시 아이콘이 표시되지 않음 (0) | 2023.09.12 |
|---|---|
| 내 Git 저장소에서 참조되지 않은 블랍을 제거하는 방법 (0) | 2023.09.12 |
| MySQL 마스터를 슬레이브로 변경 (0) | 2023.09.12 |
| 테이블 셀을 잘라내되 내용을 최대한 맞추려면 어떻게 해야 합니까? (0) | 2023.09.12 |
| 시트 간의 차이점은 무엇입니까?Sheets(시트)를 선택합니다.활성화? (0) | 2023.09.12 |