SUMÁRIO: Este artigo discutiu triggers no PostgreSQL. Ele descreve os diferentes tipos de triggers e fornece exemplos para cada:
1. Tipos de Triggers
2. Criando um Trigger
1. INSERT event trigger
2. Acionar evento UPDATE
3. Acionar evento DELETE
4. Soltando um Trigger
5. Usos de Triggers
6. Pontos importantes a lembrar
Um “trigger” é definido como qualquer evento que define um curso de ação em um movimento.
No PostgreSQL, se você quiser tomar ação em eventos específicos do banco de dados, como INSERT, UPDATE, DELETE, ou TRUNCATE, então a funcionalidade trigger pode ser útil, pois irá invocar a função requerida em eventos definidos.
O trigger será associado à tabela, vista ou tabela estrangeira especificada e executará a função especificada quando certas operações forem executadas naquela tabela. Dependendo do requerimento podemos criar o trigger ANTES, DEPOIS ou INSTEAD dos eventos/operação.
Tipos de trigger
1. Trigger de nível de linha: Se o gatilho estiver marcado FOR EACH ROW então a função de gatilho será chamada para cada linha que está sendo modificada pelo evento.
Por exemplo: Se UPDATE 100 linhas na tabela, a função de trigger UPDATE será chamada 100 vezes, uma vez para cada linha actualizada.
2. Trigger de Nível de Declaração: A opção FOR EACH STATEMENT chamará a função de trigger apenas uma vez para cada instrução, independentemente do número de linhas que forem modificadas.
Criando um Trigger
O comando SQL CREATE TRIGGER cria um trigger no objeto especificado.
A sintaxe do CREATE TRIGGER é a seguinte:
CREATE TRIGGER name { BEFORE | AFTER | INSTEAD OF } { event }ON table_name ] transition_relation_name } ] { ROW | STATEMENT } ]EXECUTE { FUNCTION | PROCEDURE } function_name ( arguments ) where event can be one of: INSERTUPDATE ]DELETETRUNCATE
Para uma descrição mais detalhada e opções disponíveis, verifique a documentação do PostgreSQL em https://www.postgresql.org/docs/12/sql-createtrigger.html.
1. INSERT event Trigger
O evento INSERT trigger é chamado quando um novo registro é adicionado a uma tabela usando a instrução INSERT.
Exemplo
Vejamos um exemplo de como criar um novo trigger. Neste exemplo, vamos criar uma nova tabela chamada “Employee” da seguinte forma:
CREATE TABLE "Employee"("EmployeeId" INT NOT NULL,"LastName" VARCHAR(20) NOT NULL,"FirstName" VARCHAR(20) NOT NULL,"Title" VARCHAR(30),"ReportsTo" INT,"BirthDate" TIMESTAMP,"HireDate" TIMESTAMP,"Address" VARCHAR(70),"City" VARCHAR(40),"State" VARCHAR(40),"Country" VARCHAR(40),"PostalCode" VARCHAR(10),"Phone" VARCHAR(24),"Fax" VARCHAR(24),"Email" VARCHAR(60),CONSTRAINT "PK_Employee" PRIMARY KEY ("EmployeeId"));CREATE TABLE "Employee_Audit"("EmployeeId" INT NOT NULL,"LastName" VARCHAR(20) NOT NULL,"FirstName" VARCHAR(20) NOT NULL,"UserName" VARCHAR(20) NOT NULL,"EmpAdditionTime" VARCHAR(20) NOT NULL,);
Vamos criar um trigger que pode adicionar uma entrada na tabela “Employee_Audit” se um novo registro de empregado for inserido na tabela “Employee”. Vamos registrar os detalhes do nome do usuário, que vai adicionar o registro na tabela “Employee”.
Adicionar uma função de trigger e comando CREATE TRIGGER:
CREATE OR REPLACE FUNCTION employee_insert_trigger_fnc() RETURNS trigger AS$$BEGIN INSERT INTO "Employee_Audit" ( "EmployeeId", "LastName", "FirstName","UserName" ,"EmpAdditionTime") VALUES(NEW."EmployeeId",NEW."LastName",NEW."FirstName",current_user,current_date);RETURN NEW;END;$$LANGUAGE 'plpgsql';CREATE TRIGGER employee_insert_trigger AFTER INSERT ON "Employee" FOR EACH ROW EXECUTE PROCEDURE employee_insert_trigger_fnc();
Após criarmos o trigger INSERT acima na tabela, ele vai adicionar uma nova entrada na tabela “Employee_Audit” com estes detalhes:
trigger_demo=# INSERT INTO "Employee" VALUES(10,' Adams','Andrew','Manager',1,'1962-02-18 00:00:00','2010-08-14 00:00:00','11120 Jasper Ave NW','Edmonton','AB','Canada','T5K 2N1','+1 780 428-9482','+1 780 428-3457','[email protected]');INSERT 0 1trigger_demo=# select * from "Employee" where "EmployeeId" =10;--------------------EmployeeId | 10LastName | AdamsFirstName | AndrewTitle | ManagerReportsTo | 1BirthDate | 1962-02-18 00:00:00HireDate | 2010-08-14 00:00:00Address | 11120 Jasper Ave NWCity | EdmontonState | ABCountry | CanadaPostalCode | T5K 2N1Phone | +1 780 428-9482Fax | +1 780 428-3457Email | [email protected]_demo=#trigger_demo=# select * from "Employee_Audit" ;----+-----------EmployeeId | 10LastName | AdamsFirstName | AndrewUserName | postgresEmpAdditionTime | 2019-11-10
2. O disparador do evento UPDATE
O disparador do evento UPDATE é chamado no momento da execução da instrução UPDATE.
Exemplo
CREATE TRIGGER verify_user_for_update BEFORE UPDATE ON "Employee" FOR EACH ROWEXECUTE PROCEDURE employee_verify_user_priv();
3. DELETE event Trigger
Este é o trigger do evento DELETE, que pode ser adicionado em transações que APAGAM os registros.
Exemplo
CREATE TRIGGER employee_delete_trigger AFTER DELETE ON "Employee" FOR EACH ROW EXECUTE PROCEDURE aft_delete();
Drop a Trigger
DROP TRIGGER é usado para remover um trigger. A sintaxe é muito simples.
drop trigger employee_insert_trigger on "Employee" ;
Uses Of Triggers
1. Auditoria: Você pode usar triggers para rastrear as transações da tabela registrando os detalhes do evento.
2. Forçando a restrição de verificação: Você pode criar um trigger pelo qual você pode verificar as restrições antes de aplicar a transação à tabela.
3. População automática: Usando triggers você também pode preencher automaticamente os campos das tabelas através da manipulação de novos registros de transações.
Important Points To Remember
1. Para criar um trigger em uma tabela, o usuário deve ter o privilégio TRIGGER na tabela e EXECUTAR privilégio na função trigger.
2. Você pode verificar o catálogo do sistema “pg_trigger” para as informações de trigger existentes no banco de dados.
3. Se você criar triggers múltiplos no mesmo objeto para o mesmo evento, esses triggers serão disparados em ordem alfabética pelo nome.