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 TRIGGERpalavras-chave. - Em seguida, determine quando o gatilho é acionado, como
BEFORE,AFTER, ouINSTEAD OF. Você pode criarBEFOREeAFTERgatilhos em uma mesa. No entanto, você só pode criar umINSTEAD OFacionar 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 ENDbloco, 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 INSERTAFTER INSERTBEFORE UPDATEAFTER UPDATEBEFORE DELETEAFTER DELETEINSTEAD OF INSERTINSTEAD OF DELETEINSTEAD 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', 'john.doe@sqlitetutorial.net', '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 = 'john.smith@sqlitetutorial.net'
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 TRIGGERpalavras-chave. - Segundo, use o
IF EXISTSopçã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.