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.
De acordo com a documentação, se vários eventos forem especificados (e você especificar dois, atualização ou inserção), a ação acionada deverá ser uma instrução compilada (ou seja, não pode ser "Begin atomic"). Esta é a razão pela qual você obtém o SQL0104N para o primeiro caso.
A seguir, para o segundo caso, quando você tiver uma instrução compilada para a ação acionada, então
OLD TABLE name and NEW TABLE name are not allowed in a trigger if the trigger is defined using a compound SQL (compiled) statement.
(este é o motivo pelo qual você obtém o código de razão 4 para SQL0696N).Considere ter gatilhos separados em vez de tentar combinar ambos em um único gatilho, ou escolha um design diferente que esteja em conformidade com as restrições.