O gatilho define um conjunto de ações a serem executadas quando ocorre um evento de banco de dados em uma determinada tabela. O evento de banco de dados é uma operação de exclusão, inserção ou de atualização. Por exemplo, se for definido um gatilho para exclusão em uma determinada tabela, a ação do gatilho ocorre sempre que se remove uma ou mais linhas da tabela.
Junto com as restrições, os gatilhos podem ajudar a impor regras de integridade com ações como exclusões ou atualizações em cascata. Os gatilhos também podem realizar várias funções como emitir alertas, atualizar outras tabelas, enviar e-mail, e outras ações úteis.
Pode ser definido qualquer número de gatilhos para uma única tabela, inclusive vários gatilhos para a mesma tabela para o mesmo evento.
Pode ser criado gatilho em qualquer esquema, exceto os começados por SYS. O gatilho não precisa residir no mesmo esquema da tabela para a qual é definido.
Se for especificado um nome de gatilho qualificado, o nome do esquema não poderá começar por SYS.
CREATE TRIGGER nome-do-gatilho { AFTER | NO CASCADE BEFORE } { INSERT | DELETE | UPDATE } [ OF nome-da-coluna [, nome-da-coluna]* ] ON nome-da-tabela [ CláusulaReferência ] FOR EACH { ROW | STATEMENT } MODE DB2SQL Instrução-SQL-engatilhada
Pode ser definido qualquer número de gatilhos para um determinado evento em uma determinada tabela. No caso de gatilho para atualização podem ser especificadas as colunas.
Muitas instruções-SQL-engatilhadas necessitam fazer referência aos dados que estão sendo alterados no momento pelo evento de banco de dados que causou o disparo do gatilho. A instrução-SQL-engatilhada pode necessitar fazer referência aos valores novos (pós-alteração ou "após").
O Derby fornece várias maneiras para fazer referência aos dados que estão sendo alterados no momento pelo evento do banco de dados que fez o gatilho disparar. Os dados alterados podem ser referenciados pela instrução-SQL-engatilhada utilizando variáveis de transição ou tabelas de transição. A cláusula de referência permite o fornecimento do nome da correlação ou aliás para estas variáveis de transição especificando OLD/NEW AS nome-da-correlação.
REFERENCING OLD AS LINHA_APAGADA
DELETE FROM DISPONIBILIDADE_HOTEL WHERE ID_HOTEL = LINHA_APAGADA.ID_HOTEL
Para os gatilhos de instrução, as tabelas de transição servem como identificador de tabela para a instrução-SQL-engatilhada ou para a qualificação do gatilho. A cláusula de referência permite fornecer um nome de correlação ou aliás para estas tabelas de transição especificando OLD_TABLE/NEW_TABLE AS nome-da-correlação
REFERENCING OLD_TABLE AS HOTÉIS_EXCLUÍDOS
DELETE FROM DISPONIBILIDADE_HOTEL WHERE ID_HOTEL IN (SELECT ID_HOTEL FROM HOTÉIS_EXCLUÍDOS)
A cláusula REFERENCING pode designar apenas uma correlação ou identificador para novo, e apenas uma correlação ou identificador para antigo. Os gatilhos de linha não podem designar um identificador para a tabela de transição, e os gatilhos de instrução não podem designar uma correlação para as variáveis de transição.
O gatilho de instrução dispara uma vez por evento de gatilho, independentemente de alguma linha ser modificada pelo evento de inserção, atualização ou exclusão.
O gatilho de linha dispara uma vez para cada linha afetada pelo evento de gatilho. Se nenhuma linha for afetada, o gatilho não vai disparar.
A instrução-SQL-engatilhada pode fazer referência a outros objetos do banco de dados além da tabela para a qual o gatilho é declarado. Se algum destes objetos for removido, o gatilho será invalidado. Se na próxima execução a recompilação do gatilho não for bem-sucedida, a chamada lançará uma exceção e a instrução que causou o disparo será desfeita.
Para obter mais informações sobre instrução-SQL-engatilhada deve ser consultado o Guia do Desenvolvedor do Derby.
Quando são definidos vários gatilhos para o mesmo evento de banco de dados, para a mesma tabela, e para o mesmo instante (antes ou depois), os gatilhos são disparados na ordem em que foram criados.
-- Instruções e gatilhos:
CREATE TRIGGER T1 NO CASCADE BEFORE UPDATE ON X
FOR EACH ROW MODE DB2SQL
values app.notifyEmail('Jerry', 'A tabela x está para ser atualizada');
CREATE TRIGGER EXCLUI_VÔOS
AFTER DELETE ON VÔOS
REFERENCING OLD_TABLE AS VÔOS_EXCLUÍDOS
FOR EACH STATEMENT MODE DB2SQL
DELETE FROM VÔOS_DISPONIBILIDADE WHERE ID_VÔO IN
(SELECT ID_VÔO FROM VÔOS_EXCLUÍDOS);
CREATE TRIGGER EXCLUI_VÔOS3
AFTER DELETE ON VÔOS
REFERENCING OLD AS OLD
FOR EACH ROW MODE DB2SQL
DELETE FROM VÔOS_DISPONIBILIDADE WHERE ID_VÔO = OLD.ID_VÔO;
A profundidade de recursividade máxima de gatilho é 16.