mysql создает триггер внутри хранимой процедуры

avatar
Sineth Lakshitha
9 августа 2021 в 04:37
214
1
0

Как создать триггер, выполнив хранимую процедуру в mysql. Если это невозможно, объясните причины. Есть ли способ динамически создавать триггеры, не создавая их каждый раз?

Источник
the_coding_cat
9 августа 2021 в 05:12
1

Вы пытались создать его внутри Events? Например, выполняя Trigger внутри Event вместо Stored Procedure, потому что в Events вы можете запланировать, когда вы хотите, чтобы он был выполнен.

Tangentially Perpendicular
9 августа 2021 в 05:17
1

Возможно, вы могли бы объяснить проблему, которую вы пытаетесь решить с помощью этого. Почти наверняка есть другой и, возможно, лучший способ

Sineth Lakshitha
9 августа 2021 в 07:06
0

У меня есть 50 таблиц в моей базе данных. Мне нужно создать хранимую процедуру, чтобы создать таблицу аудита для каждой таблицы, вызвав хранимую процедуру. А также необходимо создавать триггеры при создании таблицы аудита. Я пытаюсь добавить часть создания триггера внутри sp, но выдается ошибка.

Ответы (1)

avatar
Akina
9 августа 2021 в 05:42
1

Если это невозможно, объясните причины.


Справочное руководство по MySQL 8.0 / Сохраненные объекты / Ограничения на хранимые программы # Операторы SQL не разрешены в хранимых подпрограммах

Как правило, операторы, не разрешенные в подготовленных инструкциях SQL, также не разрешены в хранимых программах. Список операторов, поддерживаемых как подготовленные операторы, см. в Разделе 13.5, «Подготовленные операторы». Исключениями являются SIGNAL, RESIGNAL и GET DIAGNOSTICS, которые недопустимы в качестве подготовленных инструкций, но разрешены в хранимых программах.

Справочное руководство по MySQL 8.0 / Операторы SQL / Подготовленные операторы # Синтаксис SQL, разрешенный в подготовленных операторах

Предоставляется полный список разрешенных операторов. В этом списке нет оператора CREATE TRIGGER.

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


Но вы можете создать триггер и повлиять на его выполнение. Например, вы можете создать какую-то служебную таблицу в базе данных, и проверять хранящиеся в ней значения в коде триггера - использовать их как параметры или выполнять/пропускать различные блоки кода.

Это также соответствует принципу "клиентский код не должен выполнять операции DDL".