Откат SQL Trigger - PullRequest
       8

Откат SQL Trigger

0 голосов
/ 01 ноября 2018

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

Я использую MySQL для тестирования, но мы используем DB2, но они не дают мне доступа к триггерам тестирования в их среде DB2, поэтому это самое близкое решение, которое я могу использовать для тестирования логики триггера.

Я заметил, что BEGIN ATOMIC в примере запускает, это делает то, что я хочу? И что было бы эквивалентно в MySQL, чтобы я мог проверить?

У меня есть подвыборы в моих триггерах, это безопасно? Должен ли я объявлять переменные, чтобы избежать проблем?

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018
--#SET TERMINATOR @
create table test_trigger (i int) in userspace1@
create table test_trigger_copy (i int) in userspace1@

create or replace trigger test_trigger_air
after insert on test_trigger
referencing new as n
for each row
begin
  declare continue handler for sqlexception begin end;
  insert into test_trigger_copy(i) values (case when mod (n.i, 2)=0 then cast(RAISE_ERROR('70001', 'No even numbers!') as int) else n.i end);
end@

insert into test_trigger(i) values 1, 2, 3@
select * from test_trigger_copy@
select * from test_trigger@

Для баз данных DB2 (по крайней мере, для LUW).

Оператор INSERT внутри триггера генерирует исключение при попытке вставить четное число в базовую таблицу. Обработчик CONTINUE использует исключения, поэтому вы получаете все вставленные числа в базовой таблице, но только нечетные числа в таблице копирования.

0 голосов
/ 02 ноября 2018

Близкий MySQL, эквивалентный DB2 BEGIN ATOMIC, будет комбинацией START TRANSACTION, COMMIT, EXIT HANDLER и ROLLBACK. Вместо:

BEGIN ATOMIC
<statement(s)>
END

в MySQL можно сделать следующее:

BEGIN
  DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN
    ROLLBACK;
    RESIGNAL;
    END;
  START TRANSACTION;
     <statement(s)>
  COMMIT;
END

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

...