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 um
INSERT
, UPDATE
ou DELETE
A instrução é emitida em relação à tabela associada. Quando precisamos de gatilhos SQLite
Você costuma usar gatilhos para habilitar auditorias sofisticadas. Por exemplo, você deseja registrar as alterações nos dados confidenciais, como salário e endereço, sempre que houver alterações.
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.
SQLite CREATE TRIGGER
declaração
Para criar um novo gatilho no SQLite, você usa o
CREATE TRIGGER
declaração da seguinte forma:CREATE TRIGGER [IF NOT EXISTS] trigger_name
[BEFORE|AFTER|INSTEAD OF] [INSERT|UPDATE|DELETE]
ON table_name
[WHEN condition]
BEGIN
statements;
END;
Code language: SQL (Structured Query Language) (sql)
Nesta sintaxe:
- Primeiro, especifique o nome do acionador após
CREATE TRIGGER
palavras-chave. - Em seguida, determine quando o gatilho é acionado, como
BEFORE
,AFTER
, ouINSTEAD OF
. Você pode criarBEFORE
eAFTER
gatilhos em uma mesa. No entanto, você só pode criar umINSTEAD OF
acionar 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 o acionador pertence.
- Por fim, coloque a lógica do acionador no
BEGIN END
bloco, que pode ser qualquer instrução SQL válida.
Se você combinar a hora em que o gatilho é acionado e o evento que faz com que o gatilho seja acionado, você tem 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 um
UPDATE
para atualizar 10 linhas em uma tabela, o gatilho associado à tabela é disparado 10 vezes. Este gatilho é chamado FOR EACH ROW
acionar. Se o gatilho associado à tabela for disparado uma vez, chamamos esse gatilho de FOR EACH STATEMENT
acionar. A partir da versão 3.9.2, o SQLite suporta apenas
FOR EACH ROW
gatilhos. Ele ainda não é compatível com FOR EACH STATEMENT
gatilhos. Se você usar uma condição no
WHEN
cláusula, o gatilho só é invocado quando a condição for verdadeira. Caso você omita o WHEN
cláusula, o gatilho é executado para todas as linhas. Observe que, se você descartar 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 acionador faz referência a uma tabela chamada
people
, você descarta as people
tabela ou renomeá-la, você precisa alterar manualmente a definição do gatilho. Você pode acessar os dados da linha que está sendo inserida, excluída ou atualizada usando o
OLD
e NEW
referências no formato:OLD.column_name
e NEW.column_name
. o
OLD
e NEW
as referências estão disponíveis dependendo do evento que faz com que o gatilho seja acionado. A tabela a seguir ilustra as regras.:
Ação | Referência |
---|---|
INSERIR | NOVO está disponível |
ATUALIZAÇÃO | Tanto o NOVO quanto o ANTIGO estão disponíveis |
EXCLUIR | O 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
);
Code language: SQL (Structured Query Language) (sql)
1) SQLite BEFORE INSERT
exemplo de gatilho
Suponha que você queira validar o endereço de e-mail antes de inserir um novo lead nos
leads
tabela. Neste caso, você pode usar um BEFORE INSERT
acionar. Primeiro, crie um
BEFORE INSERT
acionar da seguinte forma: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;
Code language: SQL (Structured Query Language) (sql)
Usamos o
NEW
referência para acessar a coluna de email da linha que está sendo inserida. Para validar o email, usamos o
LIKE
operador para determinar se o email é válido ou não com base no padrão de email. Se o e-mail não for válido, o RAISE
A função aborta a inserção e emite uma mensagem de erro. Segundo, insira uma linha com um e-mail inválido nos
leads
tabela. INSERT INTO leads (first_name,last_name,email,phone)
VALUES('John','Doe','jjj','4089009334');
Code language: SQL (Structured Query Language) (sql)
O 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');
Code language: SQL (Structured Query Language) (sql)
Como o email é válido, a instrução insert foi executada com sucesso.
SELECT
first_name,
last_name,
email,
phone
FROM
leads;
Code language: SQL (Structured Query Language) (sql)
2) SQLite AFTER UPDATE
exemplo de gatilho
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 o 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
);
Code language: SQL (Structured Query Language) (sql)
Segundo, crie um
AFTER UPDATE
gatilho para registrar dados nos lead_logs
tabela sempre que houver uma atualização no email
ou phone
coluna. 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;
Code language: SQL (Structured Query Language) (sql)
Você percebe que na condição no
WHEN
A cláusula especifica que o gatilho é invocado somente quando há uma alteração na coluna de email ou telefone. Terceiro, atualize o sobrenome de
John
de Doe
para Smith
. UPDATE leads
SET
last_name = 'Smith'
WHERE
id = 1;
Code language: SQL (Structured Query Language) (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 de
John
aos novos. UPDATE leads
SET
phone = '4089998888',
email = '[email protected]'
WHERE
id = 1;
Code language: SQL (Structured Query Language) (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;
Code language: SQL (Structured Query Language) (sql)
Você pode desenvolver o
AFTER INSERT
e AFTER DELETE
gatilhos para registrar os dados no lead_logs
mesa como exercício. SQLite DROP TRIGGER
declaração
Para descartar um acionador existente, use o
DROP TRIGGER
declaração da seguinte forma:DROP TRIGGER [IF EXISTS] trigger_name;
Code language: SQL (Structured Query Language) (sql)
Nesta sintaxe:
- Primeiro, especifique o nome do acionador que você deseja descartar após o
DROP TRIGGER
palavras-chave. - Segundo, use o
IF EXISTS
opção para excluir o acionador somente se ele existir.
Observe que, se você descartar uma tabela, o SQLite descartará automaticamente todos os gatilhos associados à tabela.
Por exemplo, para remover o
validate_email_before_insert_leads
trigger, você usa a seguinte instrução:DROP TRIGGER validate_email_before_insert_leads;
Code language: SQL (Structured Query Language) (sql)
Neste tutorial, apresentamos os gatilhos SQLite e mostramos como criar e descartar gatilhos do banco de dados.