O que é um trigger
Um trigger (gatilho) é um bloco de SQL que o banco de dados executa
sozinho, de forma automática, quando ocorre um evento sobre uma tabela: um
INSERT, um UPDATE ou um DELETE. Serve para manter dados derivados,
registrar auditorias ou aplicar regras sem depender de a aplicação se
lembrar de fazê-lo.
CREATE TRIGGER nome_trigger
AFTER INSERT ON vendas
BEGIN
-- SQL a executar quando uma linha é inserida em vendas
END;
AFTER / BEFORE e o evento
AFTERexecuta-se depois de a mudança já estar feita;BEFORE, logo antes. Para auditar o ocorrido, o normal éAFTER.- O evento pode ser
INSERT,UPDATEouDELETEONuma tabela. - No SQLite o trigger dispara uma vez para cada linha afetada (é
FOR EACH ROWde forma implícita).
As linhas NEW e OLD
Dentro do corpo você tem duas "linhas virtuais" para ler os valores em jogo:
| Pseudotabela | Disponível em | O que contém |
|---|---|---|
NEW |
INSERT, UPDATE |
os valores novos da linha. |
OLD |
UPDATE, DELETE |
os valores anteriores da linha. |
CREATE TRIGGER log_vendas
AFTER INSERT ON vendas
BEGIN
INSERT INTO auditoria (acao, venda_id, valor)
VALUES ('insercao', NEW.id, NEW.valor);
END;
Assim, cada vez que entrar uma venda, o trigger escreve automaticamente uma linha
em auditoria com os dados de NEW. Para comprovar seu efeito, a última
sentença consulta a tabela que o trigger preencheu:
INSERT INTO vendas (id, produto_id, dia, valor) VALUES (7, 2, 4, 99);
SELECT acao, venda_id, valor FROM auditoria ORDER BY venda_id;
Os triggers são poderosos mas invisíveis: como agem por conta própria, convém nomeá-los com clareza e documentá-los para que a equipe saiba que existem.
Exemplos
Auditar cada nova venda com um trigger AFTER INSERT
CREATE TABLE auditoria (
id INTEGER PRIMARY KEY AUTOINCREMENT,
acao TEXT,
venda_id INTEGER,
valor REAL
);
CREATE TRIGGER log_vendas
AFTER INSERT ON vendas
BEGIN
INSERT INTO auditoria (acao, venda_id, valor)
VALUES ('insercao', NEW.id, NEW.valor);
END;
INSERT INTO vendas (id, produto_id, dia, valor) VALUES (7, 2, 4, 99);
SELECT acao, venda_id, valor FROM auditoria ORDER BY venda_id;