CodeGym /Cursos /SQL SELF /Criando um trigger simples para atualizar dados: AFTER IN...

Criando um trigger simples para atualizar dados: AFTER INSERT

SQL SELF
Nível 57, Lição 3
Disponível

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:

  1. Quando um novo registro é adicionado na tabela, o campo last_modified recebe automaticamente a data e hora atual.
  2. 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 chamada update_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 campo last_modified usando a função NOW(), que retorna a data e hora atual.
  • RETURN NEW; — retorna o registro atualizado. Isso é obrigatório pra trigger AFTER.

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 chamado set_last_modified.
  • AFTER INSERT — o trigger roda depois que uma linha é inserida na tabela.
  • ON students — o trigger tá ligado na tabela students.
  • 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

  1. Erro: "relation does not exist" ao criar o trigger. Esse erro aparece se a tabela students não foi criada. Confere se você criou a tabela antes de criar o trigger.
  2. 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.
  3. 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.

2
Tarefa
SQL SELF, nível 57, lição 3
Bloqueado
Criação de função e trigger para preenchimento automático do horário de atualização
Criação de função e trigger para preenchimento automático do horário de atualização
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION