Почему эти триггеры не обнаруживают неправильные данные, хотя синтаксис должен быть правильным?

#mysql #mysql-workbench #mysql-error-1064

#mysql #mysql-workbench #mysql-ошибка-1064

Вопрос:

Я хочу добавить два триггера в свою базу данных mysql, но кажется, что оба триггера не работают (хотя компилятор mysql принимает синтаксис). Я не получаю сообщение об ошибке, когда вставляю новые строки данных, которые триггер должен определить как неправильные. Вы знаете, в чем может быть ошибка?

Вот код триггеров:

 
USE `mydb`$
DROP TRIGGER IF EXISTS `mydb`.`Teilnehmer_BEFORE_INSERT` $
USE `mydb`$
CREATE DEFINER = CURRENT_USER TRIGGER `mydb`.`Teilnehmer_BEFORE_INSERT` BEFORE INSERT ON `Teilnehmer` FOR EACH ROW
BEGIN
    IF (DATEDIFF(CURRENT_DATE(),NEW.Geburtsdatum) < 6570) THEN

        -- Throw Exception
        SIGNAL SQLSTATE '45000' 
        SET MESSAGE_TEXT = 'Age is less than 18 years!';
        END IF;  -- A semicolon (delimiter) is missing here
END
$

DELIMITER ;

DELIMITER $
CREATE TRIGGER `enforce_phone_check` BEFORE INSERT ON `Teilnehmer` FOR EACH ROW 
BEGIN
   IF (NEW.Telefonnummer REGEXP '^(\ ?[0-9]{1,4}-)?[0-9]{3,10}

Вот определения таблиц:

 
CREATE TABLE IF NOT EXISTS `mydb`.`Preis` (
  `idPreis` INT NOT NULL,
  `Menge` VARCHAR(45) NULL,
  `Wert` INT NULL,
  `Art` VARCHAR(45) NULL,
  PRIMARY KEY (`idPreis`))
ENGINE = InnoDB;


CREATE TABLE IF NOT EXISTS `mydb`.`Teilnehmer` (
  `idTeilnehmer` INT NOT NULL,
  `email` VARCHAR(45) NULL,
  `Preis_idPreis` INT NOT NULL,
  `Vorname` VARCHAR(45) NULL,
  `Nachname` VARCHAR(45) NULL,
  `Strasse` VARCHAR(45) NULL,
  `Hausnr.` VARCHAR(45) NULL,
  `PLZ` INT(4) NULL,
  `Ort` VARCHAR(64) NULL,
  `Geburtsdatum` DATE NULL,
  `Telefonnummer` VARCHAR(16) NULL,
  `Bild_URL TEXT` TEXT(500) NULL,
  `ts` timestamp,
  PRIMARY KEY (`idTeilnehmer`, `Preis_idPreis`),
  INDEX `fk_Teilnehmer_Preis1_idx` (`Preis_idPreis` ASC)   VISIBLE,
  CONSTRAINT `fk_Teilnehmer_Preis1`
    FOREIGN KEY (`Preis_idPreis`)
    REFERENCES `mydb`.`Preis` (`idPreis`),
  UNIQUE Key `idTeilnehmer`(`idTeilnehmer`, `Nachname`))
ENGINE = InnoDB;



 

И вот запись таблицы, которая должна выдавать ошибку для обоих триггеров (но не выдает):

 
INSERT INTO `mydb`.`teilnehmer` (`idTeilnehmer`, `email`, `Preis_idPreis`, `Vorname`, `Nachname`, `Strasse`, `Hausnr.`, `PLZ`, `Ort`, `Geburtsdatum`, `Telefonnummer`, `Bild_URL TEXT`, `ts`) VALUES ('1', 'sdfsdf', '1', 'sdfsd', 'sdfsd', 'sdfsdf', '17', '9230', 'Flawil', '2005-06-06', '2342345', 'stsdfsdf', '2019-06-06');

 

Комментарии:

1. Черт возьми, я думаю, что уровень представления - это правильное место для проверки данных.

2. Я не могу воспроизвести вашу проблему, триггеры работают должным образом. Пожалуйста, добавьте определения таблиц и инструкции insert, которые, по вашему мнению, должны генерировать ошибки

3. Спасибо @P. Салмон, я включил информацию

4. Вы знаете, что второй триггер не сработает, если первый обнаружит ошибку? И почему в одной таблице есть 2 триггера? Код работает так, как ожидалось..

5. Проверьте, действительно ли были созданы триггеры ( show triggers like '%Teilnehmer%' ) , и проверьте, была ли строка вставлена или нет.

) = 0 THEN
SIGNAL SQLSTATE '33455'
SET MESSAGE_TEXT = 'Your Phone Number is incorrect';
END IF;
END$
DELIMITER ;
Вот определения таблиц:


И вот запись таблицы, которая должна выдавать ошибку для обоих триггеров (но не выдает):


Комментарии:

1. Черт возьми, я думаю, что уровень представления — это правильное место для проверки данных.

2. Я не могу воспроизвести вашу проблему, триггеры работают должным образом. Пожалуйста, добавьте определения таблиц и инструкции insert, которые, по вашему мнению, должны генерировать ошибки

3. Спасибо @P. Салмон, я включил информацию

4. Вы знаете, что второй триггер не сработает, если первый обнаружит ошибку? И почему в одной таблице есть 2 триггера? Код работает так, как ожидалось..

5. Проверьте, действительно ли были созданы триггеры ( show triggers like '%Teilnehmer%' ) , и проверьте, была ли строка вставлена или нет.