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