Instru????o CREATE TRIGGER

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.

Sintaxe

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

Antes ou depois: quando os gatilhos disparam

Os gatilhos s??o definidos para BEFORE (antes) ou AFTER (depois).
  • Os gatilhos BEFORE disparam antes das modifica????es da instru????o serem aplicadas, e antes de qualquer restri????o ser aplicada. Os gatilhos para antes podem ser tanto de linha quanto de instru????o (consulte Gatilhos de instru????o versus gatilhos de linha).
  • Os gatilhos AFTER disparam ap??s todas as restri????es terem sido satisfeitas, e ap??s todas as altera????es terem sido aplicadas ?? tabela de destino. Os gatilhos AFTER podem ser tanto de linha quanto de instru????o (consulte Gatilhos de instru????o versus gatilhos de linha).

Inser????o, exclus??o e atualiza????o: o que faz o gatilho disparar

O gatilho ?? disparado por um dos seguintes eventos do banco de dados, dependendo de como foi definido (consulte Sintaxe acima):
  • INSERT
  • UPDATE
  • DELETE

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.

Refer??ncia a valores antigos e novos: a cl??usula de refer??ncia

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.

Por exemplo, se for adicionada a seguinte cl??usula ?? defini????o do gatilho:
REFERENCING OLD AS LINHA_APAGADA
pode-se ent??o fazer refer??ncia a este nome de correla????o na instru????o-SQL-engatilhada:
DELETE FROM DISPONIBILIDADE_HOTEL WHERE ID_HOTEL = LINHA_APAGADA.ID_HOTEL
As vari??veis de transi????o OLD e NEW s??o mapeadas a um java.sql.ResultSet de uma ??nica linha.
Nota: Somente os gatilhos de linha (consulte Gatilhos de instru????o versus gatilhos de linha) podem utilizar vari??veis de transi????o. Os gatilhos de linha para INSERT n??o podem fazer refer??ncia ?? linha antiga. Os gatilhos de linha para DELETE n??o podem fazer refer??ncia ?? linha nova.

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

Por exemplo:
REFERENCING OLD_TABLE AS HOT??IS_EXCLU??DOS
permite utilizar este novo identificador (HOT??IS_EXCLU??DOS) na instru????o-SQL-engatilhada:
DELETE FROM DISPONIBILIDADE_HOTEL WHERE ID_HOTEL IN
(SELECT ID_HOTEL FROM HOT??IS_EXCLU??DOS)
As tabelas de transi????o antiga e nova s??o mapeadas a um java.sql.ResultSet com cardinalidade equivalente ao n??mero de linhas afetadas pelo evento do gatilho.
Nota: Somente os gatilhos de instru????o (consulte Gatilhos de instru????o versus gatilhos de linha) podem utilizar tabelas de transi????o. Os gatilhos para a instru????o INSERT n??o podem fazer refer??ncia ?? tabela OLD. Os gatilhos para a instru????o DELETE n??o podem fazer refer??ncia ?? tabela NEW.

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.

Gatilhos de instru????o versus gatilhos de linha

Deve ser especificado se o gatilho ?? um gatilho de instru????o ou um gatilho de linha:
  • gatilho de instru????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.

  • gatilho de linha

    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.

Nota: Uma atualiza????o que define o valor da coluna como o valor originalmente contido (por exemplo, UPDATE T SET C = C) faz com que o gatilho de linha dispare, embora o valor da coluna seja o mesmo que era antes do evento de gatilho.

Instru????o-SQL-engatilhada

A a????o definida pelo gatilho ?? chamada de instru????o-SQL-engatilhada (na Sintaxe acima, veja a ??ltima linha). Possui as seguintes limita????es:
  • N??o pode conter par??metros din??micos (?).
  • N??o pode criar, alterar ou remover a tabela para a qual o gatilho est?? definido.
  • N??o pode adicionar ou remover um ??ndice na tabela para a qual o gatilho est?? definido.
  • N??o pode adicionar ou remover um gatilho na tabela para a qual o gatilho est?? definido.
  • N??o pode efetivar ou desfazer a transa????o corrente, ou mudar o n??vel de isolamento.
  • N??o pode executar a instru????o CALL.
  • Os gatilhos para antes n??o podem possuir instru????es INSERT, UPDATE ou DELETE como sua a????o.

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.

Ordem de execu????o

Quando ocorre um evento de banco de dados que dispara um gatilho, o Derby realiza a????es nesta ordem:
  • Dispara os gatilhos NO CASCADE BEFORE.
  • Realiza a verifica????o das restri????es (verifica chave prim??ria, chave ??nica e chave estrangeira).
  • Realiza a inser????o, atualiza????o ou exclus??o.
  • Dispara os gatilhos AFTER.

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;

Nota: Podem ser encontrados mais exemplos no Guia do Desenvolvedor do Derby.

Recursividade de gatilho

A profundidade de recursividade m??xima de gatilho ?? 16.

Informa????es relacionadas

As fun????es de sistema especiais que retornam informa????o sobre a hora corrente ou o usu??rio corrente s??o avaliadas quando o gatilho dispara, e n??o quando o gatilho ?? criado. Estas fun????es incluem:
Refer??ncias relacionadas
Instru????o CREATE FUNCTION
Instru????o CREATE INDEX
Instru????o CREATE PROCEDURE
Instru????o CREATE SCHEMA
Instru????o CREATE SYNONYM
Instru????o CREATE TABLE
Instru????o CREATE VIEW