IBM DB2 on Cloud, versão 11.5.9.0
Tentando criar um gatilho em uma tabela ( os nomes dos objetos são inventados, para simplificar ):
CREATE OR REPLACE TRIGGER MY_TRIGGER
AFTER UPDATE OR INSERT ON MY_TABLE
REFERENCING NEW TABLE AS NEW_STUFF
FOR EACH STATEMENT
BEGIN ATOMIC
DELETE FROM TABLE_A WHERE P_N IN (SELECT DISTINCT P_N FROM NEW_STUFF);
INSERT INTO TABLE_A SELECT * FROM VIEW_B WHERE P_N IN (SELECT DISTINCT P_N FROM NEW_STUFF);
END;
A visão VIEW_B tem TABLE_A como referência em sua definição.
Estou recebendo este erro:
SQL Error [42601]: An unexpected token "OR INSERT" was found following "".
Expected tokens may include: ""..
SQLCODE=-104, SQLSTATE=42601
Se eu criar o mesmo gatilho apenas com AFTER UPDATE ON MY_TABLE ou apenas com AFTER INSERT ON MY_TABLE, ele funcionará bem. Ele falha quando eu especifico AFTER UPDATE OR INSERT .
Se eu tentar BEGIN em vez de BEGIN ATOMIC, recebo um erro diferente:
SQL Error [42898]: The definition of trigger "MY_SCHEMA.MY_TRIGGER" includes an
invalid use of correlation name or transition table name "NEW_STUFF".
Reason code="4".. SQLCODE=-696, SQLSTATE=42898
Estudei a documentação e os poucos exemplos que consegui encontrar. Se alguém souber por que a combinação de UPDATE ou INSERT está causando falha, agradeceria qualquer ajuda.