Imagina que a gente tem uma tabela onde ficam os dados dos estudantes. Nessa tabela, a gente precisa atualizar automaticamente o campo last_modified (data da última alteração do registro) toda vez que um novo estudante for adicionado. Esse campo é importante pra rastrear mudanças e gerenciar os dados.
O cenário é o seguinte:
- Quando um novo registro é adicionado na tabela, o campo
last_modifiedrecebe automaticamente a data e hora atual. - A gente vai usar um trigger
AFTER INSERT, que roda depois que os dados são inseridos com sucesso.
Criando a função pro trigger
Primeiro, a gente precisa criar uma função em PL/pgSQL. Essa função vai atualizar o campo last_modified na nossa tabela. A função é obrigatória pro trigger funcionar, porque o trigger só aponta o que tem que fazer, mas toda a lógica fica na função.
Então, bora começar criando a tabela:
-- Criando a tabela students
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
age INT NOT NULL,
last_modified TIMESTAMP
);
Agora vamos criar a função pra atualizar o campo last_modified:
-- Função pra atualizar last_modified
CREATE OR REPLACE FUNCTION update_last_modified()
RETURNS TRIGGER AS $$
BEGIN
-- Coloca a hora atual no campo last_modified
NEW.last_modified := NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
Bora entender o que essa função faz:
CREATE OR REPLACE FUNCTION update_last_modified()— cria uma função chamadaupdate_last_modified. Se já existir, ela é substituída.RETURNS TRIGGER— diz que a função é pra ser usada com trigger.NEW.last_modified := NOW();— atualiza o campolast_modifiedusando a funçãoNOW(), que retorna a data e hora atual.RETURN NEW;— retorna o registro atualizado. Isso é obrigatório pra triggerAFTER.
Criando o trigger
Depois de criar a função, a gente pode criar o trigger e ligar ele na tabela students. Olha só como faz:
-- Criando o trigger depois de inserir o registro
CREATE TRIGGER set_last_modified
AFTER INSERT ON students
FOR EACH ROW
EXECUTE FUNCTION update_last_modified();
O que tá rolando aqui:
CREATE TRIGGER set_last_modified— cria um trigger chamadoset_last_modified.AFTER INSERT— o trigger roda depois que uma linha é inserida na tabela.ON students— o trigger tá ligado na tabelastudents.FOR EACH ROW— o trigger executa pra cada linha nova que entrar na tabela.EXECUTE FUNCTION update_last_modified();— chama a função que a gente criou antes.
Observação: o nome do trigger (set_last_modified) e da função (update_last_modified) pode ser qualquer um, mas é bom seguir um padrão pra deixar o código mais fácil de entender.
Testando o trigger
Bora ver como o trigger funciona. Primeiro, vamos adicionar alguns registros na tabela students:
-- Inserindo dados na tabela
INSERT INTO students (name, age) VALUES ('Ivan Ivanov', 20);
INSERT INTO students (name, age) VALUES ('Anna Petrova', 22);
Agora vamos ver como ficou a tabela:
-- Vendo os dados na tabela
SELECT * FROM students;
O resultado esperado pode ser mais ou menos assim:
| id | name | age | last_modified |
|---|---|---|---|
| 1 | Otto Min | 20 | 2023-10-10 14:30:45 |
| 2 | Anna Song | 22 | 2023-10-10 14:31:12 |
Repara que o campo last_modified foi preenchido automaticamente com a data e hora atual pra cada registro.
Erros que podem acontecer
- Erro: "relation does not exist" ao criar o trigger. Esse erro aparece se a tabela
studentsnão foi criada. Confere se você criou a tabela antes de criar o trigger. - Erro de permissão. Se o usuário do banco não tem permissão pra criar funções ou triggers, o trigger não vai ser criado. Checa as permissões do usuário.
- Faltou chamar a função no trigger. Se você esquecer de colocar
EXECUTE FUNCTION update_last_modified(), o trigger não vai fazer o que precisa.
Melhorando o trigger: colocando condições
No mundo real, às vezes é útil limitar quando o trigger roda. Por exemplo, se o campo age for menor que 18, a gente não quer atualizar o last_modified. Dá pra fazer isso usando a condição WHEN:
-- Criando trigger com condição
CREATE TRIGGER set_last_modified
AFTER INSERT ON students
FOR EACH ROW
WHEN (NEW.age >= 18)
EXECUTE FUNCTION update_last_modified();
Agora o campo last_modified só vai ser atualizado pra estudantes com idade >= 18.
Aplicação prática
Triggers como esse são muito usados em projetos de verdade. Alguns exemplos:
- Atualizar automaticamente a hora da última alteração do registro (igual a gente fez).
- Rastrear mudanças no banco e salvar essas mudanças numa tabela de logs.
- Garantir integridade dos dados, tipo checar tabelas relacionadas antes de fazer alguma operação.
- Auditoria de dados pra seguir regras legais ou da empresa.
Essas skills são muito úteis se você trabalha com sistemas onde precisão e confiabilidade dos dados são importantes, tipo bancos, sistemas de estoque ou CRM.
GO TO FULL VERSION