English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial básico PostgreSQL

Tutorial avançado PostgreSQL

Interface PostgreSQL

Trigger do PostgreSQL

Os gatilhos PostgreSQL são funções de callback do banco de dados, que são executados automaticamente quando ocorre um evento específico no banco de dados./Chamada.

A seguir estão alguns pontos importantes sobre os gatilhos PostgreSQL:

  • Os gatilhos PostgreSQL podem ser acionados em várias situações:

    • Antes de executar a operação (antes de verificar a restrição e tentar inserir, atualizar ou excluir).

    • Após executar a operação (após verificar a restrição e concluir a inserção, atualização ou exclusão).

    • Operação de atualização (ao inserir, atualizar ou excluir em uma visão).

  • O atributo FOR EACH ROW do gatilho é opcional. Se selecionado, é chamado uma vez por linha ao modificar; ao contrário, se selecionado FOR EACH STATEMENT, o gatilho marcado por cada instrução é executado uma vez, independentemente de quantas linhas forem modificadas.

  • A cláusula WHEN e a operação do gatilho referem-se a NEW.column-name e OLD.column-name pode acessar cada elemento da linha ao inserir, excluir ou atualizar o formulário. Dentre column-name é o nome da coluna na tabela associada ao gatilho.

  • Se houver cláusula WHEN, a instrução PostgreSQL será executada apenas na linha em que a cláusula WHEN for verdadeira, se não houver cláusula WHEN, a instrução PostgreSQL será executada em cada linha.

  • As palavras-chave BEFORE ou AFTER determinam quando a ação do gatilho é executada, decidindo se a ação do gatilho é executada antes ou após a inserção, modificação ou exclusão de linhas relacionadas.

  • A tabela a ser modificada deve existir no mesmo banco de dados, como uma tabela ou visão anexada ao gatilho, e deve usar apenas tablename, não database.tablename.

  • Quando é criado um gatilho de restrição, são especificadas as opções de restrição. Isso é semelhante ao gatilho convencional, mas pode usar essa restrição para ajustar o tempo de gatilho do gatilho. Quando a restrição implementada pelo gatilho de restrição é violada, ele lança uma exceção.

Sintaxe

A sintaxe básica para criar um gatilho é a seguinte:

CREATE TRIGGER trigger_name [BEFORE|AFTER|INSTEAD OF] event_name
ON table_name
[
 -- Lógica do gatilho...
];

Aqui, event_name pode ser INSERT, DELETE e UPDATE operações de banco de dados na tabela table_name mencionada. Você pode escolher especificar FOR EACH ROW após o nome da tabela.

Aqui está a sintaxe para criar um gatilho em uma ou mais colunas específicas da tabela:

CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name
ON table_name
[
 -- Lógica do gatilho...
];

Exemplo online

Vamos considerar uma situação, queremos manter um teste de auditoria para cada registro inserido na tabela COMPANY recém-criada (se já existir, será excluída e recarregada):

w3codeboxdb=# CREATE TABLE COMPANY(
   ID INT PRIMARY KEY  NOT NULL,
   NAME            TEXT  NOT NULL,
   AGE             INT  NOT NULL,
   ADDRESS         CHAR(50),
   SALARY          REAL
);

Para manter o teste de auditoria, criaremos uma nova tabela chamada AUDIT. Sempre que houver um novo item na tabela COMPANY, a mensagem de log será inserida nela:

w3codeboxdb=# CREATE TABLE AUDIT(
   EMP_ID INT NOT NULL,
   ENTRY_DATE TEXT NOT NULL
);

Aqui, ID é o ID do registro AUDIT, EMP_ID é o ID proveniente da tabela COMPANY, DATE manterá o carimbo de tempo do registro criado na tabela COMPANY. Portanto, vamos criar um gatilho na tabela COMPANY conforme abaixo:

w3codeboxdb=# CREATE TRIGGER example_trigger AFTER INSERT ON COMPANY FOR EACH ROW EXECUTE PROCEDURE auditlogfunc();

auditlogfunc() é um programa do PostgreSQL, cuja definição é a seguinte:

CREATE OR REPLACE FUNCTION auditlogfunc() RETURNS TRIGGER AS $example_table$
   BEGIN
      INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, current_timestamp);
      RETURN NEW;
   END;
$example_table$ LANGUAGE plpgsql;

现在,我们开始往 COMPANY 表中插入数据:

w3codeboxdb=# INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, 'Paul', 32, 'California', 20000.00 );

这时,COMPANY 表中插入了一条记录:

同时, AUDIT 表中也插入了一条记录,因为我们在插入 COMPANY 表时创建了一个触发器。相似的,我们也可以根据需求在更新和删除时创建触发器:

emp_id | entry_date
--------+-------------------------------
      1 | 2013-05-05 15:49:59.968+05:30
(1 row)

列出触发器

你可以将 pg_trigger 表中当前数据库的所有触发器列举出来:

w3codeboxdb=# SELECT * FROM pg_trigger;

如果你想列出特定表的触发器,语法如下:

w3codeboxdb=# SELECT tgname FROM pg_trigger, pg_class WHERE tgrelid=pg_class.oid AND relname='company';

得到结果如下:

 tgname
-----------------
 example_trigger
(1 row)

删除触发器

删除触发器的基本语法如下:

drop trigger ${trigger_name} on ${table_of_trigger_dependent};

删除本文上表 company 上的触发器 example_trigger 的指令为:

drop trigger example_trigger on company;