CREATE TRIGGER

Nome

CREATE TRIGGER -- cria um gatilho

Sinopse

CREATE TRIGGER nome { BEFORE | AFTER } { evento [ OR ... ] }
    ON tabela [ FOR [ EACH ] { ROW | STATEMENT } ]
    EXECUTE PROCEDURE nome_da_função ( argumentos )

Descrição

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.

Parâmetros

nome
O nome a ser dado ao novo gatilho, devendo ser distinto do nome de qualquer outro gatilho para a mesma tabela.
BEFORE
AFTER
Determina se a função é chamada antes ou depois do evento.
evento
Um entre INSERT, UPDATE ou DELETE; especifica o evento que dispara o gatilho. Vários eventos podem ser especificados utilizando OR.
tabela
O nome (opcionalmente qualificado pelo esquema) da tabela que o gatilho se destina.
FOR EACH ROW
FOR EACH STATEMENT
Especifica se o procedimento do gatilho deve ser disparado uma vez para cada linha afetada pelo evento do gatilho, ou apenas uma vez para a declaração SQL. Se nenhum dos dois for especificado, FOR EACH STATEMENT é usado por padrão.
nome_da_função
Uma função fornecida pelo usuário, declarada como não recebendo nenhum argumento e retornando o tipo trigger, que é executada quando o gatilho dispara.
argumentos
Uma lista opcional de argumentos, separados por vírgula, passada para a função quando o gatilho é executado. Os argumentos são constantes cadeia de caracteres literais. Também podem ser escritos nomes simples e constantes numéricas, mas estes são convertidos em cadeias de caracteres. Por favor, verifique como os argumentos do gatilho são acessados dentro da função, na descrição da linguagem de implementação da função de gatilho; pode ser diferente dos argumentos das função normais.

Observações

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.

Exemplos

A Seção 35.4 contém um exemplo completo.

Compatibilidade

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.

Veja também

CREATE FUNCTION , ALTER TRIGGER , DROP TRIGGER

Notas

[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.)

SourceForge.net Logo