Triggers MySQL para Automação

MySQLBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá a usar triggers do MySQL para automatizar ações no banco de dados. Triggers são programas armazenados que executam automaticamente em resposta a eventos específicos em uma tabela, como operações de INSERT, UPDATE ou DELETE.

Você criará uma tabela products para armazenar informações de itens e uma tabela product_logs para auditar alterações. Em seguida, implementará um trigger que adiciona automaticamente uma entrada de log em product_logs toda vez que um novo produto for inserido na tabela products. O laboratório também o guiará através do teste, atualização e remoção do trigger.

Este é um Lab Guiado, que fornece instruções passo a passo para ajudá-lo a aprender e praticar. Siga as instruções cuidadosamente para completar cada etapa e ganhar experiência prática. Dados históricos mostram que este é um laboratório de nível iniciante com uma taxa de conclusão de 81%. Recebeu uma taxa de avaliações positivas de 89% dos estudantes.

Configurar o Banco de Dados e as Tabelas

Antes de criar um trigger, você precisa de um banco de dados e das tabelas necessárias. Neste passo, você criará um banco de dados chamado mydatabase e duas tabelas: products para armazenar dados de produtos e product_logs para armazenar logs de auditoria.

Primeiro, abra o terminal a partir do seu desktop.

Conecte-se ao servidor MySQL como o usuário root. Como este é um ambiente de laboratório, você pode usar sudo para conectar sem senha.

sudo mysql -u root

Uma vez conectado, você verá o prompt do MySQL (mysql>).

Agora, crie o banco de dados mydatabase e mude para ele. A cláusula IF NOT EXISTS evita um erro se o banco de dados já existir.

CREATE DATABASE IF NOT EXISTS mydatabase;
USE mydatabase;

Em seguida, crie a tabela products. Esta tabela armazenará o ID, nome e preço de cada produto.

CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    price DECIMAL(10, 2) NOT NULL
);

Agora, crie a tabela product_logs. Esta tabela armazenará um log de cada novo produto adicionado.

CREATE TABLE product_logs (
    log_id INT AUTO_INCREMENT PRIMARY KEY,
    product_id INT,
    action_description VARCHAR(255),
    log_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Você pode verificar se ambas as tabelas foram criadas com sucesso executando:

SHOW TABLES;

Você deverá ver as tabelas products e product_logs listadas na saída.

+--------------------+
| Tables_in_mydatabase |
+--------------------+
| product_logs       |
| products           |
+--------------------+
2 rows in set (0.00 sec)

Agora que o banco de dados e as tabelas estão prontos, você pode continuar para o próximo passo.

Criar e Testar um Trigger

Com as tabelas prontas, você pode agora criar um trigger. Este trigger será ativado após uma nova linha ser inserida na tabela products e adicionará uma entrada correspondente à tabela product_logs.

Mude para o seu banco de dados.

USE mydatabase;

Agora, crie o trigger. O comando DELIMITER é usado para mudar o delimitador padrão (;) para //, de modo que o ponto e vírgula dentro do corpo do trigger não seja interpretado como o fim da instrução CREATE TRIGGER.

DELIMITER //

CREATE TRIGGER products_after_insert
AFTER INSERT ON products
FOR EACH ROW
BEGIN
    INSERT INTO product_logs (product_id, action_description)
    VALUES (NEW.id, CONCAT('New product added: ', NEW.name));
END//

DELIMITER ;

Vamos analisar esta instrução:

  • CREATE TRIGGER products_after_insert: Define um novo trigger com o nome products_after_insert.
  • AFTER INSERT ON products: Especifica que o trigger será acionado após um evento de INSERT na tabela products.
  • FOR EACH ROW: Indica que a lógica do trigger será executada para cada linha que for inserida.
  • BEGIN...END: Engloba as instruções SQL do trigger.
  • NEW.id, NEW.name: A palavra-chave NEW refere-se à linha que acabou de ser inserida. NEW.id é o id do novo produto, e NEW.name é o seu nome.

Agora, vamos testar o trigger inserindo um novo produto.

INSERT INTO products (name, price) VALUES ('Laptop', 1200.00);

Esta operação de INSERT deve ter ativado o trigger. Para confirmar isso, verifique o conteúdo da tabela product_logs.

SELECT * FROM product_logs;

Você deverá ver um registro na tabela product_logs, que foi criado automaticamente pelo trigger. A saída será semelhante a esta (o log_id e log_time variarão):

+--------+------------+-----------------------------+---------------------+
| log_id | product_id | action_description          | log_time            |
+--------+------------+-----------------------------+---------------------+
|      1 |          1 | New product added: Laptop   | 2024-05-27 10:30:00 |
+--------+------------+-----------------------------+---------------------+
1 row in set (0.00 sec)

Isso confirma que seu trigger está funcionando corretamente.

Atualizar a Lógica do Trigger

Seus requisitos podem mudar com o tempo. Por exemplo, você pode querer registrar mais detalhes. Neste passo, você atualizará o trigger para também registrar o preço do novo produto.

No MySQL, você não pode modificar um trigger diretamente. Você deve primeiro remover o trigger existente e depois criar um novo com a lógica atualizada.

Mude para o seu banco de dados.

USE mydatabase;

Primeiro, remova o trigger existente. A cláusula IF EXISTS evita um erro se o trigger já tiver sido removido.

DROP TRIGGER IF EXISTS products_after_insert;

Agora, recrie o trigger com a lógica atualizada. Esta nova versão incluirá o preço do produto na action_description.

DELIMITER //

CREATE TRIGGER products_after_insert
AFTER INSERT ON products
FOR EACH ROW
BEGIN
    INSERT INTO product_logs (product_id, action_description)
    VALUES (NEW.id, CONCAT('New product added: ', NEW.name, ' with price ', NEW.price));
END//

DELIMITER ;

Para testar o trigger atualizado, insira outro produto.

INSERT INTO products (name, price) VALUES ('Mouse', 25.00);

Agora, consulte a tabela product_logs para ver todas as entradas de log.

SELECT * FROM product_logs;

A saída agora deve mostrar duas entradas de log. A segunda entrada, para o 'Mouse', deve incluir o preço em sua descrição, confirmando que seu trigger atualizado está funcionando.

+--------+------------+----------------------------------------------+---------------------+
| log_id | product_id | action_description                           | log_time            |
+--------+------------+----------------------------------------------+---------------------+
|      1 |          1 | New product added: Laptop                    | 2024-05-27 10:30:00 |
|      2 |          2 | New product added: Mouse with price 25.00    | 2024-05-27 10:35:00 |
+--------+------------+----------------------------------------------+---------------------+
2 rows in set (0.00 sec)

Você atualizou o trigger com sucesso.

Remover o Trigger

Se um trigger não for mais necessário, você deve removê-lo para evitar processamento desnecessário e potenciais problemas de manutenção. Neste passo final, você removerá o trigger products_after_insert.

Mude para o seu banco de dados.

USE mydatabase;

Para remover o trigger, use a instrução DROP TRIGGER.

DROP TRIGGER IF EXISTS products_after_insert;

Você pode verificar se o trigger foi removido executando o comando SHOW TRIGGERS.

SHOW TRIGGERS;

Este comando deve produzir um conjunto vazio, confirmando que o trigger foi removido.

Empty set (0.00 sec)

Para ter certeza absoluta, insira mais um produto.

INSERT INTO products (name, price) VALUES ('Keyboard', 75.00);

Agora, verifique a tabela product_logs.

SELECT * FROM product_logs;

A tabela ainda deve conter apenas as duas primeiras entradas de log. O produto 'Keyboard' não deve ter uma entrada de log, pois o trigger foi removido antes da inserção.

+--------+------------+----------------------------------------------+---------------------+
| log_id | product_id | action_description                           | log_time            |
+--------+------------+----------------------------------------------+---------------------+
|      1 |          1 | New product added: Laptop                    | 2024-05-27 10:30:00 |
|      2 |          2 | New product added: Mouse with price 25.00    | 2024-05-27 10:35:00 |
+--------+------------+----------------------------------------------+---------------------+
2 rows in set (0.00 sec)

Isso confirma que o trigger foi removido com sucesso. Você agora pode sair do shell do MySQL.

exit;

Resumo

Neste laboratório, você aprendeu os fundamentos do uso de triggers do MySQL para automação. Você configurou com sucesso um ambiente de banco de dados, criou tabelas e implementou um trigger para registrar eventos de inserção de dados. Você também praticou o ciclo de vida completo de um trigger, incluindo sua criação, teste, atualização e remoção.

Essas habilidades são essenciais para tarefas como a criação de trilhas de auditoria, a aplicação de regras de negócios complexas e a manutenção automática da integridade dos dados em seu banco de dados.