CREATE TRIGGER

Name

CREATE TRIGGER  --  define um novo gatilho

Synopsis

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

Entradas

nome

O nome do novo gatilho.

tabela

O nome de uma tabela existente.

evento

Um entre INSERT, DELETE e UPDATE.

função

Uma função fornecida pelo usuário.

Saídas

CREATE

Mensagem retornada se o gatilho for criado com sucesso.

Descrição

O comando CREATE TRIGGER introduz um novo gatilho no banco de dados atual. O gatilho fica associado com a relação tabela e executa a função especificada função.

O gatilho pode ser especificado para disparar antes (BEFORE) da operação ser realizada na tupla (antes das restrições serem verificadas e o INSERT, UPDATE ou DELETE serem efetuados) ou após (AFTER) a operação ser realizada (ou seja, após as restrições serem verificadas e o INSERT, UPDATE ou DELETE ter completado). Se o gatilho disparar antes do evento, o gatilho pode evitar a operação para a tupla atual, ou modificar a tupla sendo inserida (para as operações de INSERT e UPDATE somente). Se o gatilho disparar após o evento todas as modificações, incluindo a última inserção, atualização ou exclusão, são "visíveis" para o gatilho.

O SELECT não modifica nenhuma linha, portanto não é possível criar gatilhos para SELECT. Regras e visões são mais apropriadas para este caso.

Consulte os capítulos sobre SPI (Interface de Programação do Servidor) e Gatilhos no Guia do Programador do PostgreSQL para obter mais informações.

Notas

Para criar um gatilho em uma tabela, o usuário deve possuir o privilégio TRIGGER na tabela.

Na versão atual, gatilhos de declaração (STATEMENT triggers) não estão implementados.

Consulte o comando DROP TRIGGER para obter informações sobre como remover gatilhos.

Exemplos

Verificar se o código do distribuidor existe na tabela de distribuidores antes de inserir ou atualizar uma linha da tabela filmes:

CREATE TRIGGER se_dist_existe
    BEFORE INSERT OR UPDATE ON filmes FOR EACH ROW
    EXECUTE PROCEDURE verificar_chave_primaria ('did', 'distribuidores', 'did');

Antes de remover um distribuidor, ou de atualizar o seu código, remover todas as referências para a tabela filmes:

CREATE TRIGGER se_filme_existe
    BEFORE DELETE OR UPDATE ON distribuidores FOR EACH ROW
    EXECUTE PROCEDURE verificar_chave_primaria (1, 'CASCADE', 'did', 'filmes', 'did');

O segundo exemplo também pode ser implementado usando uma chave estrangeira, como em:

CREATE TABLE distribuidores (
    did      DECIMAL(3),
    nome     VARCHAR(40),
    CONSTRAINT se_filme_existe
    FOREIGN KEY(did) REFERENCES filmes
    ON UPDATE CASCADE ON DELETE CASCADE  
);

Compatibilidade

SQL92

Não existe o comando CREATE TRIGGER no SQL92.

SQL99

O comando CREATE TRIGGER do PostgreSQL implementa um subconjunto do padrão SQL99. As seguintes funcionalidades estão faltando:

  • O SQL99 permite os gatilhos dispararem quando da atualização de colunas específicas (por exemplo, AFTER UPDATE OF col1, col2).

  • O SQL99 permite definir aliás para as linhas ou tabelas "velha" e "nova" para uso na definição das ações do gatilho (por exemplo, CREATE TRIGGER ... ON nome_tabela REFERENCING OLD ROW AS algum_nome NEW ROW AS outro_nome ...). Como o PostgreSQL permite que os procedimentos dos gatilhos sejam escritos em qualquer linguagem definida pelo usuário, o acesso aos dados é realizado na forma específica da linguagem.

  • O PostgreSQL somente possui gatilhos a nível de linha, não possuindo gatilhos a nível de declaração.

  • O PostgreSQL somente permite a execução de procedimentos armazenados para a ação do gatilho. O SQL99 permite a execução de vários outros comandos SQL, como o CREATE TABLE, para a ação de um gatilho. Esta limitação não é difícil de ser contornada criando-se um procedimento armazenado que execute estes comandos.

Consulte também

CREATE FUNCTION, DROP TRIGGER , Guia do Programador do PostgreSQL