Как определить работу триггера MySQL - PullRequest
0 голосов
/ 26 декабря 2018

В Oracle при написании уникального триггера, который обрабатывает операции INSERT, UPDATE OR DELETE, когда можно определить, какая операция выполняется с использованием этого метода, называемого ' Условные предикаты '

create trigger sample_trigger
    before insert or update
    on sample_table
    for each row
begin
    case
        when inserting then
            --do something
        when updating then
            --do something
    end case;
end;

Предоставляет ли MySQL 5.6 какую-либо технику, которая позволяет мне делать то же самое?Я не хотел бы писать три разных триггера только для того, чтобы определить, какая операция выполняется.Спасибо!

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

К сожалению, вы не можете.

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

Синтаксис:

trigger_event: {INSERT |ОБНОВЛЕНИЕ |DELETE}

, что означает, что вы можете выбрать только одно событие как trigger_event.

другой аргумент в том же документе:

Не может быть несколько триггеровдля данной таблицы, которые имеют одинаковое событие триггера и время действия.Например, у вас не может быть двух триггеров BEFORE UPDATE для таблицы.Но у вас может быть триггер BEFORE UPDATE и BEFORE INSERT или триггер BEFORE UPDATE и AFTER UPDATE.

0 голосов
/ 26 декабря 2018

Нет.В MySQL (даже в 8.0) триггеры могут вызываться только для одного типа операции, INSERT, UPDATE или DELETE.Из руководства синтаксис для CREATE TRIGGER:

CREATE
    [DEFINER = { user | CURRENT_USER }]
    TRIGGER trigger_name
    trigger_time trigger_event
    ...

и trigger_event может быть только один из INSERT, UPDATE илиDELETE:

trigger_event: { INSERT | UPDATE | DELETE }

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

Что вы могли бы сделать вместо этого, поместить код триггера в хранимую процедуру, а затем вызвать его с параметром, который определяет, может ли тип операции, например, для триггера INSERT, использовать

CREATE TRIGGER db_insert
BEFORE INSERT ON db
FOR EACH ROW
BEGIN
    CALL db_trigger_proc('INSERT');
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...