SQL создает событие в триггере после вставки - PullRequest
1 голос
/ 17 апреля 2019

Для моей базы данных я должен заархивировать видео с определенной отметкой времени Unix, которая хранится в базе данных.Итак, я подумал, что было бы достаточно легко создать триггер, который запускается после вставки в таблицу, а затем создать событие, чтобы запланировать архивирование видео.Я написал следующий оператор SQL:

CREATE TRIGGER `ArchiveVido_onInsert` AFTER INSERT ON `tableName`FOR EACH ROW
    CREATE EVENT archiveVideo
      ON SCHEDULE AT inserted.Time_to_Archive
      DO
        UPDATE MediaPage SET is_archived = 1;

Но я получаю следующую ошибку:

#1576 Recursion of EVENT DDL statements is forbidden when body is present

Как мне сделать то, что я пытаюсь?Или я просто что-то упустил?Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 17 апреля 2019

Вы не можете запустить операторы, которые вызывают неявную фиксацию внутри триггера. Это включает в себя любой оператор DDL, который определяет или изменяет объект базы данных (CREATE EVENT count).

https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html говорит:

Триггер не может использовать операторы, которые явно или неявно начинают или заканчивают транзакцию ...

Вместо этого вам следует определить общее СОБЫТИЕ, которое периодически запускается и обновляет любые видео, которые необходимо архивировать.

CREATE EVENT archiveVideo
  ON SCHEDULE EVERY 1 MINUTE
  DO 
    UPDATE MediaPage SET is_archived = 1 
    WHERE is_archived = 0 AND Time_to_Archive < NOW()
    LIMIT 1000;

Убедитесь, что в (is_archived, Time_to_Archive) есть индекс, поэтому предложение WHERE оптимизировано для соответствия строк для обновления.

Я добавил LIMIT 1000, чтобы он не пытался обновить слишком много строк в одной транзакции. Если в данный момент существует более 1000 видео для архивации, им придется подождать еще 1 минуту, чтобы событие снова запустилось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...