Em sistemas críticos, saber “quem mudou o quê e quando” é vital para a segurança e conformidade.
Nesta aplicação final, vamos construir um sistema de auditoria imutável usando Triggers do MySQL.
Triggers são procedimentos que rodam automaticamente dentro do banco de dados quando um UPDATE, INSERT ou DELETE ocorre.
A vantagem de fazer isso no nível do banco (e não no PHP) é que nem mesmo acessos diretos via phpMyAdmin escaparão do log.
Isso cria uma camada de segurança à prova de falhas para dados sensíveis como preços de produtos ou privilégios de usuários.
Criando a Tabela de Trilha de Auditoria
A tabela de logs deve registrar o valor antigo e o novo valor de cada coluna alterada.
Utilizaremos campos JSON para armazenar esses estados, permitindo que façamos “diffs” visuais posteriormente.
A segurança aqui é reforçada pelo fato de que a tabela de auditoria só deve permitir inserções, nunca exclusões.
Didaticamente, estamos criando um “Livro Razão” (Ledger) da base de dados.
CREATE TABLE wp_audit_logs (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
table_name VARCHAR(50),
record_id BIGINT,
action ENUM('INSERT', 'UPDATE', 'DELETE'),
old_values JSON,
new_values JSON,
changed_by VARCHAR(100),
changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;
Agora, vamos escrever o Trigger MySQL para monitorar a tabela wp_posts.
O Trigger usará as palavras-chave OLD e NEW para acessar os dados antes e depois da modificação.
Isso é processamento de baixíssimo nível, extremamente rápido e transparente para a aplicação WordPress.
O PHP nem saberá que o log está sendo gerado, o que reduz o tempo de resposta da página.
DELIMITER //
CREATE TRIGGER audit_post_update
AFTER UPDATE ON wp_posts
FOR EACH ROW
BEGIN
INSERT INTO wp_audit_logs (table_name, record_id, action, old_values, new_values)
VALUES (
'wp_posts',
OLD.ID,
'UPDATE',
JSON_OBJECT('title', OLD.post_title, 'content', OLD.post_content),
JSON_OBJECT('title', NEW.post_title, 'content', NEW.post_content)
);
END; //
DELIMITER ;
O uso de DELIMITER é necessário para que o MySQL entenda que o bloco de código do trigger é uma instrução única.
Seniores utilizam essa técnica para garantir a integridade dos dados em multi-tenancy ou sistemas financeiros.
Se um invasor conseguir acesso ao admin do WordPress e alterar o conteúdo de um post importante, você terá a prova histórica exata do que foi mudado.
O MundoPHP acredita que segurança e performance caminham juntas quando usamos o poder total do banco de dados.
Auditoria não é um luxo, é uma necessidade para quem leva o desenvolvimento a sério.


