SQLite
 sql >> Base de Dados >  >> RDS >> SQLite

Acionador SQLite


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 , ou INSTEAD OF . Você pode criar BEFORE e AFTER gatilhos em uma mesa. No entanto, você só pode criar um INSTEAD OF acionar em uma visualização.
  • Em seguida, especifique o evento que faz com que o gatilho seja invocado, como INSERT , UPDATE , ou DELETE .
  • 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.