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.
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 nomeproducts_after_insert.AFTER INSERT ON products: Especifica que o trigger será acionado após um evento deINSERTna tabelaproducts.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-chaveNEWrefere-se à linha que acabou de ser inserida.NEW.idé oiddo novo produto, eNEW.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.



