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
lubINSTEAD OF
. Możesz utworzyćBEFORE
iAFTER
wyzwalacze na stole. Możesz jednak utworzyć tylkoINSTEAD OF
wyzwalacz na widoku. - Następnie określ zdarzenie, które powoduje wywołanie wyzwalacza, takie jak
INSERT
,UPDATE
lubDELETE
. - 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.