Обязательно используйте 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)
... и затем проверка информации_схемы:
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)