Olá, visitante!
A pedido de um amigo, irei abordar sobre Triggers, vamos lá!
Conceito: Uma trigger é um objeto de base que é associado com uma tabela e é ativado quando um evento especial acontece numa tabela. Por exemplo, sempre que um INSERT, DELETE ou UPDATE for realizado numa determinada base, pode-se desejar criar outro registro numa outra tabela. Triggers são ativadas por comandos SQL (Fonte: Wikipédia).
Pra que serve uma Trigger?: Vamos pensar no seguinte contexto: Você tem a sua tabela de clientes e quer monitorar todas as alterações que são realizadas nela, desde correção de dados à inclusão de novos, para que você não tenha o trabalho de disparar uma função no seu código fonte, a trigger fará isso pra você de forma automática sempre que realizar algum UPDATE, DELETE ou INSERT nessa tabela.
Legal, né?
Vamos brincar um pouco? Legal!
Primeiramente vamos criar um banco, segue a DDL:
CREATE DATABASE db_trigger
WITH OWNER = postgres
ENCODING = 'UTF8'
TEMPLATE = template0;
Agora vamos à tabela:
CREATE TABLE public.clientes (
cliente_id BIGSERIAL NOT NULL,
cliente_nome VARCHAR(50) NOT NULL,
cliente_endereco VARCHAR(50) NOT NULL,
cliente_inativo BOOLEAN DEFAULT False NOT NULL,
PRIMARY KEY(cliente_id)
) WITHOUT OIDS;
Vamos inserir alguns dados nessa tabela:
INSERT INTO clientes (cliente_nome, cliente_endereco, cliente_inativo) VALUES ('Naruto Uzumaki', 'Konoha', False);
INSERT INTO clientes (cliente_nome, cliente_endereco, cliente_inativo) VALUES ('Sasuke Uchiha', 'Indefinido', False);
INSERT INTO clientes (cliente_nome, cliente_endereco, cliente_inativo) VALUES ('Jackson Teller', 'Sons of Anarchy M.C.', False);
INSERT INTO clientes (cliente_nome, cliente_endereco, cliente_inativo) VALUES ('Clarence Morrow', 'Sons of Anarchy M.C.', False);
INSERT INTO clientes (cliente_nome, cliente_endereco, cliente_inativo) VALUES ('Jon Snow', 'Back to Winterfell', False);
INSERT INTO clientes (cliente_nome, cliente_endereco, cliente_inativo) VALUES ('Daenerys Targaryen', 'Where Dragons Go', False);
Agora vamos a melhor parte, criação da trigger. Essa trigger será simples, sempre que eu fazer um UPDATE na tabela, ele irá gerar um registro na tabela "clientes_log".
Mas antes, aproveitando a DDL da criação da tabelas clientes, vamos criar a tabela de "clientes_logs":
CREATE TABLE public.clientes_log (
clienteslog_id BIGSERIAL NOT NULL,
clientes_log_id INTEGER NOT NULL,
clientes_log_nome VARCHAR(50) NOT NULL,
clientes_log_endereco VARCHAR(50) NOT NULL,
clientes_log_inativo BOOLEAN DEFAULT False NOT NULL,
PRIMARY KEY(clienteslog_id)
) WITHOUT OIDS;
Você deve estar se perguntando o motivo de não ter deixado o mesmo nome dos campos, a resposta é simples: PADRONIZAÇÃO. Quanto mais padrões, melhor.
Hoje eu tenho 1 trigger, amanhã 10, mês que vem 100. Se não houve padrão vai virar uma bagunça total.
Agora vamos criar a trigger:
CREATE FUNCTION clientes_log ()
RETURNS trigger AS'
BEGIN
INSERT INTO clientes_log(clientes_log_id, clientes_log_nome, clientes_log_endereco, clientes_log_inativo)
VALUES (OLD.cliente_id, OLD.cliente_nome, OLD.cliente_endereco, OLD.cliente_inativo);
RETURN NEW;
END;
'LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER;
CREATE TRIGGER clientes_log
BEFORE UPDATE
ON public.clientes FOR EACH ROW
EXECUTE PROCEDURE clientes_log();
Deixa eu explanar essa trigger pra vocês, vamos lá:
O que nos interessa aqui é o que está entre o BEGIN e END:
SEMPRE que eu fizer um UPDATE na tabela "clientes" ela irá ativar a trigger, e sempre que ela for ativada, irá executar um INSERT na tabela "clientes_log" por base nos dados da(s) tupla(s) que foram alteradas.
Como eu quero pegar o valor anterior à alteração, eu utilizo uma palavra reservada chama OLD, e, logo após, o nome do campo, ou seja, o nome atual de uma determinado cliente é "Naturo Uzumaki" e eu corrigi para "Naruto Uzumaki", ao utilizar o OLD.cliente_nome, a trigger irá inserir "Naturo Uzumaki" na tabela "clientes_log".
Simples, não? Também acho.
Há várias sintaxes e formas de utilizar uma trigger, não vou entrar muito em detalhe mas deixarei aqui o link da documentação do PostgreSQL caso vocês tenham interesse em aprofundar mais no assunto: https://www.postgresql.org/docs/9.2/static/plpgsql-trigger.html
É isso, qualquer dúvida, por favor, poste abaixo.
Obrigado!
Lucas de Souza Cruz

0 Comentários
Deixe aqui suas dúvidas, opiniões e contribuições =}
Emoji