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.