SQLite
 sql >> Baza danych >  >> RDS >> SQLite

Wyzwalacz SQLite

Podsumowanie :ten samouczek omawia wyzwalacz SQLite, który jest obiektem bazy danych uruchamianym automatycznie po zmianie danych w tabeli.

Co to jest wyzwalacz SQLite

Wyzwalacz SQLite to nazwany obiekt bazy danych, który jest wykonywany automatycznie, gdy INSERT , UPDATE lub DELETE oświadczenie jest wystawiane w odniesieniu do powiązanej tabeli.

Kiedy potrzebujemy wyzwalaczy SQLite

Często używasz wyzwalaczy, aby umożliwić zaawansowaną inspekcję. Na przykład chcesz rejestrować zmiany w wrażliwych danych, takich jak wynagrodzenie i adres, gdy tylko się zmienią.

Ponadto używasz wyzwalaczy do egzekwowania złożonych reguł biznesowych centralnie na poziomie bazy danych i zapobiegania nieprawidłowym transakcjom.

SQLite CREATE TRIGGER oświadczenie

Aby utworzyć nowy wyzwalacz w SQLite, użyj CREATE TRIGGER oświadczenie w następujący sposób:

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)

W tej składni:

  • Najpierw określ nazwę wyzwalacza po CREATE TRIGGER słowa kluczowe.
  • Następnie określ, kiedy wyzwalacz zostanie uruchomiony, na przykład BEFORE , AFTER lub INSTEAD OF . Możesz utworzyć BEFORE i AFTER wyzwalacze na stole. Możesz jednak utworzyć tylko INSTEAD OF wyzwalacz na widoku.
  • Następnie określ zdarzenie, które powoduje wywołanie wyzwalacza, takie jak INSERT , UPDATE lub DELETE .
  • Następnie wskaż tabelę, do której należy wyzwalacz.
  • Na koniec umieść logikę wyzwalacza w BEGIN END blok, który może być dowolnymi poprawnymi instrukcjami SQL.

Jeśli połączysz czas uruchomienia wyzwalacza i zdarzenie, które powoduje jego uruchomienie, masz w sumie 9 możliwości:

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

Załóżmy, że używasz UPDATE w celu zaktualizowania 10 wierszy w tabeli wyzwalacz skojarzony z tabelą jest uruchamiany 10 razy. Ten wyzwalacz nazywa się FOR EACH ROW cyngiel. Jeśli wyzwalacz powiązany z tabelą zostanie uruchomiony jeden raz, nazywamy go wyzwalaczem FOR EACH STATEMENT wyzwalacz.

Od wersji 3.9.2, SQLite obsługuje tylko FOR EACH ROW wyzwalacze. Nie obsługuje jeszcze FOR EACH STATEMENT wyzwalacze.

Jeśli używasz warunku w WHEN klauzula, wyzwalacz jest wywoływany tylko wtedy, gdy warunek jest prawdziwy. W przypadku pominięcia WHEN klauzula, wyzwalacz jest wykonywany dla wszystkich wierszy.

Zauważ, że jeśli usuniesz tabelę, wszystkie powiązane wyzwalacze również zostaną usunięte. Jeśli jednak wyzwalacz odwołuje się do innych tabel, wyzwalacz nie jest usuwany ani zmieniany, jeśli inne tabele zostaną usunięte lub zaktualizowane.

Na przykład wyzwalacz odwołuje się do tabeli o nazwie people , upuszczasz people tabeli lub zmień jej nazwę, musisz ręcznie zmienić definicję wyzwalacza.

Możesz uzyskać dostęp do danych wstawianego, usuwanego lub aktualizowanego wiersza za pomocą OLD i NEW referencje w postaci:OLD.column_name i NEW.column_name .

OLD i NEW odniesienia są dostępne w zależności od zdarzenia, które powoduje uruchomienie wyzwalacza.

Poniższa tabela ilustruje zasady.:

Działanie Odniesienie
WSTAW NOWE jest dostępne
AKTUALIZACJA Dostępne są zarówno NOWE, jak i STARE
USUŃ STARE jest dostępne

Przykłady wyzwalaczy SQLite

Utwórzmy nową tabelę o nazwie leady, aby przechowywać wszystkie leady biznesowe firmy.

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 przykład wyzwalacza

Załóżmy, że chcesz zweryfikować adres e-mail przed wstawieniem nowego potencjalnego klienta do leads stół. W takim przypadku możesz użyć BEFORE INSERT wyzwalacz.

Najpierw utwórz BEFORE INSERT wyzwalać w następujący sposób:

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)

Użyliśmy NEW odniesienie, aby uzyskać dostęp do kolumny e-maili wstawianego wiersza.

Aby zweryfikować e-mail, użyliśmy LIKE operatora, aby określić, czy wiadomość e-mail jest ważna, czy nie, na podstawie wzorca wiadomości e-mail. Jeśli e-mail jest nieprawidłowy, RAISE funkcja przerywa wstawianie i wyświetla komunikat o błędzie.

Po drugie, wstaw wiersz z nieprawidłowym adresem e-mail do leads tabela.

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

SQLite wysłał błąd:„Nieprawidłowy adres e-mail” i przerwał wykonywanie wstawiania.

Po trzecie, wstaw wiersz z prawidłowym adresem e-mail.

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

Ponieważ adres e-mail jest prawidłowy, instrukcja insert została wykonana pomyślnie.

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

2) SQLite AFTER UPDATE przykład wyzwalacza

Telefony i e-maile leadów są tak ważne, że nie możesz sobie pozwolić na utratę tych informacji. Na przykład ktoś przypadkowo aktualizuje adres e-mail lub telefon do niewłaściwych lub nawet go usuwa.

Aby chronić te cenne dane, używasz wyzwalacza do rejestrowania wszystkich zmian dokonanych w telefonie i e-mailu.

Najpierw utwórz nową tabelę o nazwie lead_logs do przechowywania danych historycznych.

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)

Po drugie, utwórz AFTER UPDATE wyzwalacz do rejestrowania danych w lead_logs tabela, gdy pojawi się aktualizacja w email lub phone kolumna.

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)

Zauważasz, że w warunku w WHEN klauzula określa, że ​​wyzwalacz jest wywoływany tylko wtedy, gdy nastąpi zmiana w kolumnie e-mail lub telefon.

Po trzecie, zaktualizuj nazwisko John od Doe do Smith .

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

Wyzwalacz log_contact_after_update nie został wywołany, ponieważ nie nastąpiła zmiana adresu e-mail ani telefonu.

Po czwarte, zaktualizuj adres e-mail i telefon John do nowych.

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

Jeśli sprawdzisz tabelę dziennika, zobaczysz tam nowy wpis.

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

Możesz opracować AFTER INSERT i AFTER DELETE wyzwala rejestrowanie danych w lead_logs stół jako ćwiczenie.

SQLite DROP TRIGGER oświadczenie

Aby usunąć istniejący wyzwalacz, użyj DROP TRIGGER oświadczenie w następujący sposób:

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

W tej składni:

  • Najpierw określ nazwę wyzwalacza, który chcesz usunąć po DROP TRIGGER słowa kluczowe.
  • Po drugie, użyj IF EXISTS opcja usunięcia wyzwalacza tylko wtedy, gdy istnieje.

Pamiętaj, że jeśli usuniesz tabelę, SQLite automatycznie usunie wszystkie wyzwalacze powiązane z tabelą.

Na przykład, aby usunąć validate_email_before_insert_leads wyzwalacz, użyj następującego oświadczenia:

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

W tym samouczku przedstawiliśmy wyzwalacze SQLite i pokażemy, jak tworzyć i usuwać wyzwalacze z bazy danych.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dlaczego otrzymuję wyjątek java.lang.IllegalArgumentException:wartość wiązania w indeksie 1 jest w tym przypadku null?

  2. Pułapki i pułapki SQLite

  3. aktualizowanie i kompaktowanie bazy danych sqlite w systemie Android

  4. Jaki jest cel mapy projekcji systemu Android u dostawcy zawartości?

  5. Czy kiedykolwiek wywołano metodę onUpgrade?