Resumo : este tutorial discute o gatilho SQLite, que é um objeto de banco de dados disparado automaticamente quando os dados em uma tabela são alterados.
O que é um gatilho SQLite
Um gatilho SQLite é um objeto de banco de dados nomeado que é executado automaticamente quando uma INSERT
instrução UPDATE
ou DELETE
é emitida na tabela associada.
Quando precisamos de gatilhos SQLite
Você costuma usar gatilhos para permitir auditorias sofisticadas. Por exemplo, você deseja registrar as alterações nos dados confidenciais, como salário e endereço, sempre que eles forem alterados.
Além disso, você usa gatilhos para impor regras de negócios complexas centralmente no nível do banco de dados e evitar transações inválidas.
CREATE TRIGGER
Instrução SQLite
Para criar um novo gatilho no SQLite, você usa a CREATE TRIGGER
seguinte instrução:
CREATE TRIGGER [IF NOT EXISTS] trigger_name
[BEFORE|AFTER|INSTEAD OF] [INSERT|UPDATE|DELETE]
ON table_name
[WHEN condition]
BEGIN
statements;
END;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Nesta sintaxe:
- Primeiro, especifique o nome do gatilho após as
CREATE TRIGGER
palavras-chave. - Em seguida, determine quando o gatilho é acionado, como
BEFORE
,AFTER
ouINSTEAD OF
. Você pode criarBEFORE
gatilhosAFTER
em uma tabela. No entanto, você só pode criar umINSTEAD OF
gatilho em uma visualização. - Em seguida, especifique o evento que faz com que o gatilho seja invocado, como
INSERT
,UPDATE
ouDELETE
. - Depois disso, indique a tabela à qual pertence o gatilho.
- Por fim, coloque a lógica do gatilho no
BEGIN END
bloco, que pode ser qualquer instrução SQL válida.
Se você combinar o momento em que o gatilho é acionado e o evento que faz com que o gatilho seja acionado, você terá um total de 9 possibilidades:
BEFORE INSERT
AFTER INSERT
BEFORE UPDATE
AFTER UPDATE
BEFORE DELETE
AFTER DELETE
INSTEAD OF INSERT
INSTEAD OF DELETE
INSTEAD OF UPDATE
Suponha que você use uma UPDATE
instrução para atualizar 10 linhas em uma tabela, o gatilho associado à tabela é acionado 10 vezes. Este gatilho é chamado FOR EACH ROW
de gatilho. Se o gatilho associado à tabela for disparado uma vez, chamamos esse gatilho de FOR EACH STATEMENT
gatilho.
A partir da versão 3.9.2, o SQLite suporta apenas FOR EACH ROW
gatilhos. Ainda não apoiou os FOR EACH STATEMENT
gatilhos.
Se você usar uma condição na WHEN
cláusula, o gatilho só será invocado quando a condição for verdadeira. Caso você omita a WHEN
cláusula, o gatilho é executado para todas as linhas.
Observe que se você eliminar uma tabela , todos os gatilhos associados também serão excluídos. No entanto, se o gatilho fizer referência a outras tabelas, o gatilho não será removido ou alterado se outras tabelas forem removidas ou atualizadas.
Por exemplo, um gatilho faz referência a uma tabela chamada people
, você descarta a people
tabela ou a renomeia, é necessário alterar manualmente a definição do gatilho.
Você pode acessar os dados da linha que está sendo inserida, excluída ou atualizada usando as referências OLD
e NEW
no formato: OLD.column_name
e NEW.column_name
.
as referências OLD
e NEW
estão disponíveis dependendo do evento que faz com que o gatilho seja disparado.
A tabela a seguir ilustra as regras.:
Ação | Referência |
---|---|
INSERIR | NOVO está disponível |
ATUALIZAR | NOVOS e ANTIGOS estão disponíveis |
EXCLUIR | ANTIGO está disponível |
Exemplos de gatilhos SQLite
Vamos criar uma nova tabela chamada leads para armazenar todos os leads de negócios da empresa.
CREATE TABLE leads (
id integer PRIMARY KEY,
first_name text NOT NULL,
last_name text NOT NULL,
phone text NOT NULL,
email text NOT NULL,
source text NOT NULL
);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
BEFORE INSERT
1) Exemplo de gatilho SQLite
Suponha que você queira validar o endereço de e-mail antes de inserir um novo lead na leads
tabela. Nesse caso, você pode usar um BEFORE INSERT
gatilho.
Primeiro, crie um BEFORE INSERT
gatilho da seguinte maneira:
CREATE TRIGGER validate_email_before_insert_leads
BEFORE INSERT ON leads
BEGIN
SELECT
CASE
WHEN NEW.email NOT LIKE '%_@__%.__%' THEN
RAISE (ABORT,'Invalid email address')
END;
END;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Utilizamos a NEW
referência para acessar a coluna email da linha que está sendo inserida.
Para validar o email, utilizamos o LIKE
operador para determinar se o email é válido ou não com base no padrão de email. Se o email não for válido, a RAISE
função aborta a inserção e emite uma mensagem de erro.
Segundo, insira uma linha com um email inválido na leads
tabela.
INSERT INTO leads (first_name,last_name,email,phone)
VALUES('John','Doe','jjj','4089009334');
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
SQLite emitiu um erro: “Endereço de email inválido” e abortou a execução da inserção.
Terceiro, insira uma linha com um email válido.
INSERT INTO leads (first_name, last_name, email, phone)
VALUES ('John', 'Doe', '[email protected]', '4089009334');
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Como o e-mail é válido, a instrução insert foi executada com sucesso.
SELECT
first_name,
last_name,
email,
phone
FROM
leads;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
AFTER UPDATE
2) Exemplo de gatilho SQLite
Os telefones e e-mails dos leads são tão importantes que você não pode perder essas informações. Por exemplo, alguém acidentalmente atualiza o e-mail ou telefone para os errados ou até mesmo os exclui.
Para proteger esses dados valiosos, você usa um gatilho para registrar todas as alterações feitas no telefone e no e-mail.
Primeiro, crie uma nova tabela chamada lead_logs
para armazenar os dados históricos.
CREATE TABLE lead_logs (
id INTEGER PRIMARY KEY,
old_id int,
new_id int,
old_phone text,
new_phone text,
old_email text,
new_email text,
user_action text,
created_at text
);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Segundo, crie um AFTER UPDATE
gatilho para registrar dados na lead_logs
tabela sempre que houver uma atualização na coluna email
ou phone
.
CREATE TRIGGER log_contact_after_update
AFTER UPDATE ON leads
WHEN old.phone <> new.phone
OR old.email <> new.email
BEGIN
INSERT INTO lead_logs (
old_id,
new_id,
old_phone,
new_phone,
old_email,
new_email,
user_action,
created_at
)
VALUES
(
old.id,
new.id,
old.phone,
new.phone,
old.email,
new.email,
'UPDATE',
DATETIME('NOW')
) ;
END;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Você percebe que a condição da WHEN
cláusula especifica que o gatilho é invocado somente quando há uma alteração na coluna email ou telefone.
Terceiro, atualize o sobrenome de John
from Doe
para Smith
.
UPDATE leads
SET
last_name = 'Smith'
WHERE
id = 1;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
O gatilho log_contact_after_update
não foi invocado porque não houve alteração no e-mail ou telefone.
Quarto, atualize o e-mail e o telefone John
para os novos.
UPDATE leads
SET
phone = '4089998888',
email = '[email protected]'
WHERE
id = 1;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Se você verificar a tabela de log, verá que há uma nova entrada lá.
SELECT
old_phone,
new_phone,
old_email,
new_email,
user_action
FROM
lead_logs;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Você pode desenvolver os gatilhos AFTER INSERT
e AFTER DELETE
para registrar os dados na lead_logs
tabela como um exercício.
DROP TRIGGER
Instrução SQLite
Para eliminar um gatilho existente, você usa a DROP TRIGGER
instrução a seguir:
DROP TRIGGER [IF EXISTS] trigger_name;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Nesta sintaxe:
- Primeiro, especifique o nome do gatilho que deseja eliminar após as
DROP TRIGGER
palavras-chave. - Segundo, use a
IF EXISTS
opção de excluir o gatilho somente se ele existir.
Observe que se você eliminar uma tabela, o SQLite eliminará automaticamente todos os gatilhos associados à tabela.
Por exemplo, para remover o validate_email_before_insert_leads
gatilho, você usa a seguinte instrução:
DROP TRIGGER validate_email_before_insert_leads;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Neste tutorial, apresentamos os gatilhos SQLite e mostramos como criar e eliminar gatilhos do banco de dados.