MySQL Fire Trigger для вставки и обновления - PullRequest
96 голосов
/ 23 августа 2009

Можно ли запустить 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 триггера? Код одинаков для обоих, и я не хочу его повторять.

Ответы [ 3 ]

114 голосов
/ 23 августа 2009

Вам нужно создать два триггера, но вы можете переместить общий код в процедуру, и они оба вызовут процедуру.

43 голосов
/ 30 августа 2014

В ответ на запрос @Zxaos, поскольку у нас не может быть операторов AND / OR для триггеров MySQL, начиная с вашего кода, ниже приведен полный пример достижения того же самого.

1. Определите триггер INSERT:

DELIMITER //
DROP TRIGGER IF EXISTS my_insert_trigger//
CREATE DEFINER=root@localhost 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. Определите триггер ОБНОВЛЕНИЕ

DELIMITER //
DROP TRIGGER IF EXISTS my_update_trigger//

CREATE DEFINER=root@localhost 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 DEFINER=root@localhost 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 ;

Вы заметите, что я позабочусь о восстановлении разделителя, когда закончу с моим бизнесом, определяя триггеры и процедуру.

12 голосов
/ 23 июня 2013

к сожалению, мы не можем использовать в MySQL после описания INSERT или UPDATE , как в Oracle

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