SQLite
 sql >> база данни >  >> RDS >> SQLite

SQLite тригер

Резюме :този урок обсъжда SQLite тригера, който е обект на база данни, задействан автоматично, когато данните в таблицата се променят.

Какво е SQLite тригер

Тригерът на SQLite е обект на база данни с име, който се изпълнява автоматично, когато INSERT , UPDATE или DELETE изявление се издава срещу свързаната таблица.

Кога имаме нужда от SQLite тригери

Често използвате тригери, за да активирате сложен одит. Например, искате да регистрирате промените в чувствителните данни, като заплата и адрес, когато се променят.

Освен това използвате тригери, за да наложите централно сложни бизнес правила на ниво база данни и да предотвратите невалидни транзакции.

SQLite CREATE TRIGGER изявление

За да създадете нов тригер в SQLite, използвате CREATE TRIGGER изявление, както следва:

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)

В този синтаксис:

  • Първо, посочете името на тригера след CREATE TRIGGER ключови думи.
  • След това определете кога се задейства тригерът, като например BEFORE , AFTER , или INSTEAD OF . Можете да създадете BEFORE и AFTER тригери на маса. Можете обаче да създадете само INSTEAD OF задействане при изглед.
  • След това посочете събитието, което причинява извикване на тригера, като INSERT , UPDATE или DELETE .
  • След това посочете таблицата, към която принадлежи тригерът.
  • Накрая поставете логиката на тригера в BEGIN END блок, който може да бъде всякакви валидни SQL изрази.

Ако комбинирате времето, когато спусъкът се задейства и събитието, което причинява задействане на тригера, имате общо 9 възможности:

  • BEFORE INSERT
  • AFTER INSERT
  • BEFORE UPDATE
  • AFTER UPDATE
  • BEFORE DELETE
  • AFTER DELETE
  • INSTEAD OF INSERT
  • INSTEAD OF DELETE
  • INSTEAD OF UPDATE

Да предположим, че използвате UPDATE оператор за актуализиране на 10 реда в таблица, тригерът, свързан с таблицата, се задейства 10 пъти. Този тригер се нарича FOR EACH ROW задействане. Ако тригерът, свързан с таблицата, се задейства веднъж, ние наричаме това задействане FOR EACH STATEMENT задействане.

От версия 3.9.2 SQLite поддържа само FOR EACH ROW тригери. Той все още не поддържа FOR EACH STATEMENT тригери.

Ако използвате условие в WHEN клауза, тригерът се извиква само когато условието е вярно. В случай, че пропуснете WHEN клауза, тригерът се изпълнява за всички редове.

Забележете, че ако пуснете таблица, всички свързани тригери също се изтриват. Въпреки това, ако тригерът препраща към други таблици, той не се премахва или променя, ако други таблици бъдат премахнати или актуализирани.

Например, тригерът препраща към таблица с име people , пускате people таблица или я преименувате, трябва ръчно да промените дефиницията на тригера.

Можете да получите достъп до данните за реда, който се вмъква, изтрива или актуализира, като използвате OLD и NEW препратки във формата:OLD.column_name и NEW.column_name .

OLD и NEW препратките са налични в зависимост от събитието, което причинява задействане на тригера.

Следната таблица илюстрира правилата.:

Действие Справка
INSERT НОВО е налично
АКТУАЛИЗИРАНЕ И НОВИ, и СТАРИ са налични
ИЗТРИВАНЕ OLD е наличен

Примери за задействане на SQLite

Нека създадем нова таблица, наречена потенциални клиенти, за да съхраняваме всички бизнес потенциални клиенти на компанията.

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 пример за задействане

Да предположим, че искате да потвърдите имейл адреса, преди да вмъкнете нов потенциален клиент в leads маса. В този случай можете да използвате BEFORE INSERT задействане.

Първо, създайте BEFORE INSERT задействайте, както следва:

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)

Използвахме NEW препратка за достъп до колоната за имейл на реда, който се вмъква.

За да потвърдим имейла, използвахме LIKE оператор, за да определи дали имейлът е валиден или не въз основа на шаблона на имейла. Ако имейлът не е валиден, RAISE функцията прекратява вмъкването и издава съобщение за грешка.

Второ, поставете ред с невалиден имейл в leads таблица.

INSERT INTO leads (first_name,last_name,email,phone)
VALUES('John','Doe','jjj','4089009334');Code language: SQL (Structured Query Language) (sql)

SQLite издаде грешка:„Невалиден имейл адрес“ и прекъсна изпълнението на вмъкването.

Трето, поставете ред с валиден имейл.

INSERT INTO leads (first_name, last_name, email, phone)
VALUES ('John', 'Doe', '[email protected]', '4089009334');Code language: SQL (Structured Query Language) (sql)

Тъй като имейлът е валиден, инструкцията за вмъкване е изпълнена успешно.

SELECT
	first_name,
	last_name,
	email,
	phone
FROM
	leads;Code language: SQL (Structured Query Language) (sql)

2) SQLite AFTER UPDATE пример за задействане

Телефоните и имейлите на потенциалните клиенти са толкова важни, че не можете да си позволите да загубите тази информация. Например някой случайно актуализира имейла или телефона до грешни или дори го изтрие.

За да защитите тези ценни данни, използвате тригер за регистриране на всички промени, направени в телефона и имейла.

Първо създайте нова таблица, наречена lead_logs за съхраняване на исторически данни.

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)

Второ, създайте AFTER UPDATE тригер за регистриране на данни в lead_logs таблица винаги, когато има актуализация в email или 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;Code language: SQL (Structured Query Language) (sql)

Забелязвате това в условието в WHEN Клаузата указва, че тригерът се извиква само когато има промяна в колоната за имейл или телефон.

Трето, актуализирайте фамилното име на John от Doe до Smith .

UPDATE leads
SET 
   last_name = 'Smith'
WHERE
   id = 1;Code language: SQL (Structured Query Language) (sql)

Тригерът log_contact_after_update не беше извикан, защото нямаше промяна в имейла или телефона.

Четвърто, актуализирайте имейла и телефона на John към новите.

UPDATE leads
SET 
   phone = '4089998888',
   email = '[email protected]'
WHERE
   id = 1;Code language: SQL (Structured Query Language) (sql)

Ако проверите таблицата с регистрационни файлове, ще видите, че там има нов запис.

SELECT
   old_phone, 
   new_phone, 
   old_email, 
   new_email, 
   user_action
FROM
   lead_logs;Code language: SQL (Structured Query Language) (sql)

Можете да разработите AFTER INSERT и AFTER DELETE задейства за регистриране на данните в lead_logs таблица като упражнение.

SQLite DROP TRIGGER изявление

За да премахнете съществуващ тригер, използвате DROP TRIGGER изявление, както следва:

DROP TRIGGER [IF EXISTS] trigger_name;Code language: SQL (Structured Query Language) (sql)

В този синтаксис:

  • Първо посочете името на тригера, който искате да изключите след DROP TRIGGER ключови думи.
  • Второ, използвайте IF EXISTS опция за изтриване на тригера само ако съществува.

Обърнете внимание, че ако пуснете таблица, SQLite автоматично ще премахне всички тригери, свързани с таблицата.

Например, за да премахнете validate_email_before_insert_leads тригер, използвате следния израз:

DROP TRIGGER validate_email_before_insert_leads;Code language: SQL (Structured Query Language) (sql)

В този урок ви запознахме със задействанията на SQLite и ви показваме как да създавате и пускате тригери от базата данни.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLite група по/брой часове, дни, седмици, година

  2. Намерете нарушения на външния ключ в SQLite

  3. Регистрирайте времето на заявка в SQLite на Android

  4. 2 примерни бази данни за SQLite

  5. Какви са режийните разходи при използването на AUTOINCREMENT за SQLite на Android?