Ответ 1
Вам нужно создать два триггера, но вы можете переместить общий код в процедуру и попросить их вызвать процедуру.
Можно ли запустить триггер mysql для событий вставки и обновления таблицы?
Я знаю, что могу сделать следующее
CREATE TRIGGER my_trigger
AFTER INSERT ON `table`
FOR EACH ROW
BEGIN
.....
END //
CREATE TRIGGER my_trigger
AFTER UPDATE ON `table`
FOR EACH ROW
BEGIN
.....
END //
Но как я могу сделать
CREATE TRIGGER my_trigger
AFTER INSERT ON `table` AND
AFTER UPDATE ON `table`
FOR EACH ROW
BEGIN
.....
Возможно ли, или мне нужно использовать 2 триггера? Код тот же для обоих, и я не хочу его повторять.
Вам нужно создать два триггера, но вы можете переместить общий код в процедуру и попросить их вызвать процедуру.
В ответ на запрос @Zxaos, поскольку у нас не могут быть операторы AND/OR для триггеров MySQL, начиная с вашего кода, ниже приведен полный пример для достижения того же.
1. Определите триггер INSERT:
DELIMITER //
DROP TRIGGER IF EXISTS my_insert_trigger//
CREATE [email protected] TRIGGER my_insert_trigger
AFTER INSERT ON `table`
FOR EACH ROW
BEGIN
-- Call the common procedure ran if there is an INSERT or UPDATE on `table`
-- NEW.id is an example parameter passed to the procedure but is not required
-- if you do not need to pass anything to your procedure.
CALL procedure_to_run_processes_due_to_changes_on_table(NEW.id);
END//
DELIMITER ;
2. Определите триггер UPDATE
DELIMITER //
DROP TRIGGER IF EXISTS my_update_trigger//
CREATE [email protected] TRIGGER my_update_trigger
AFTER UPDATE ON `table`
FOR EACH ROW
BEGIN
-- Call the common procedure ran if there is an INSERT or UPDATE on `table`
CALL procedure_to_run_processes_due_to_changes_on_table(NEW.id);
END//
DELIMITER ;
3. Определите общую ПРОЦЕДУРУ, используемую этими триггерами:
DELIMITER //
DROP PROCEDURE IF EXISTS procedure_to_run_processes_due_to_changes_on_table//
CREATE [email protected] PROCEDURE procedure_to_run_processes_due_to_changes_on_table(IN table_row_id VARCHAR(255))
READS SQL DATA
BEGIN
-- Write your MySQL code to perform when a `table` row is inserted or updated here
END//
DELIMITER ;
Обратите внимание, что я позабочусь о восстановлении разделителя, когда я закончил свой бизнес, определяя триггеры и процедуру.
К сожалению, мы не можем использовать в MySQL после описания INSERT или UPDATE, например, в Oracle