CREATE TRIGGER nome { BEFORE | AFTER } { evento [ OR ... ] } ON tabela [ FOR [ EACH ] { ROW | STATEMENT } ] EXECUTE PROCEDURE nome_da_função ( argumentos )
O comando CREATE TRIGGER cria um gatilho. O gatilho fica associado à tabela especificada e executa a função especificada nome_da_função quando determinados eventos ocorrem. [1] [2] [3]
O gatilho pode ser especificado para disparar antes de tentar realizar a operação na linha (antes das restrições serem verificadas e o comando INSERT, UPDATE ou DELETE ser tentado), ou após a operação estar completa (após as restrições serem verificadas e o INSERT, UPDATE ou DELETE ter completado). Se o gatilho for disparado antes do evento, o gatilho pode evitar a operação para a linha corrente, ou modificar a linha sendo inserida (para as operações de INSERT e UPDATE somente). Se o gatilho for disparado após o evento, todas as mudanças, incluindo a última inserção, atualização ou exclusão, são "visíveis" para o gatilho.
Se o gatilho estiver marcado como FOR EACH ROW então é chamado uma vez para cada linha modificada pela operação. Por exemplo, um comando DELETE afetando 10 linhas faz com que todos os gatilhos ON DELETE da relação de destino sejam chamados 10 vezes, uma vez para cada linha excluída. Por outro lado, um gatilho marcado como FOR EACH STATEMENT somente executa uma vez para uma determinada operação, a despeito de quantas linhas sejam modificadas; em particular, uma operação que não modifica nenhuma linha ainda assim resulta na execução de todos os gatilhos FOR EACH STATEMENT aplicáveis.
Se vários gatilhos do mesmo tipo estão definidos para o mesmo evento, estes são disparados na ordem alfabética de seus nomes [4] .
O SELECT não modifica nenhuma linha e, portanto, não é possível criar gatilhos para SELECT. Regras e visões são mais apropriadas neste caso.
Consulte o Capítulo 35 para obter mais informações sobre gatilhos.
Para poder criar um gatilho em uma tabela, o usuário deve possuir o privilégio TRIGGER na tabela.
Nas versões do PostgreSQL anteriores a 7.3, era necessário declarar as funções dos gatilhos como retornando o tipo opaque em vez de trigger. Para permitir a carga das cópias de segurança antigas, o comando CREATE TRIGGER aceita funções declaradas como retornando opaque, mas mostra uma mensagem e muda para trigger o tipo retornado declarado pela função.
Deve ser utilizado o comando DROP TRIGGER para remover um gatilho.
A declaração CREATE TRIGGER do PostgreSQL implementa um subconjunto do padrão SQL:1999 (O padrão SQL-92 não trata de gatilhos). As seguintes funcionalidades estão faltando:
O SQL:1999 especifica que os vários gatilhos devem ser disparados na ordem da data de criação. O PostgreSQL usa a ordem dos nomes, que foi considerada mais conveniente para se trabalhar.
A capacidade de especificar várias ações para um único gatilho utilizando OR é uma extensão do PostgreSQL ao padrão SQL.
[1] |
O gatilho, embora não seja definido como um componente da tabela base, é um objeto associado a uma única tabela base. O gatilho especifica o evento de gatilho, o momento de ação do gatilho, e uma ou mais ações engatilhadas. O evento de gatilho especifica que ação na tabela base deverá causar as ações engatilhadas. O evento de gatilho é um entre INSERT, DELETE e UPDATE. O momento de ação do gatilho especifica se a ação do gatilho será efetuada BEFORE (antes) ou AFTER (após) o evento do gatilho. A ação engatilhada é um procedimento SQL ou BEGIN ATOMIC, seguido por uma ou mais <declaração de procedimento SQL>, seguido por END. (ISO-ANSI Working Draft) Framework (SQL/Framework), August 2003, ISO/IEC JTC 1/SC 32, 25-jul-2003, ISO/IEC 9075-2:2003 (E) (N. do T.) |
[2] |
Oracle — Os gatilhos de banco de dados permitem definir e obrigar regras de integridade, mas os gatilhos de banco de dados não são a mesma coisa que restrições de integridade. Entre outras coisas, o gatilho de banco de dados não verifica os dados já carregados na tabela. Portanto, é altamente recomendado que o uso de gatilhos de banco de dados seja feito somente quanto as regras de integridade referencial não puderem ser obrigadas através de restrições de integridade. Introduction to the Oracle Server (N. do T.) |
[3] |
IBM — No Centro de Controle do DB2 8.1 trigger é traduzido como disparador. (N. do T.) |
[4] |
Oracle — Embora os gatilhos de tipos diferentes sejam disparados em uma ordem específica, não há garantia que os gatilhos do mesmo tipo para o mesmo comando sejam disparados em uma ordem específica. Por exemplo, pode ser que os os gatilhos BEFORE row para o mesmo comando UPDATE nem sempre sejam disparados na mesma ordem. As aplicações devem ser projetadas de forma que não dependam da ordem de disparo de vários gatilhos do mesmo tipo. Triggers (N. do T.) |