Zusammenfassung :Dieses Tutorial behandelt den SQLite-Trigger, ein Datenbankobjekt, das automatisch ausgelöst wird, wenn die Daten in einer Tabelle geändert werden.
Was ist ein SQLite-Trigger
Ein SQLite-Trigger ist ein benanntes Datenbankobjekt, das automatisch ausgeführt wird, wenn ein INSERT
, UPDATE
oder DELETE
-Anweisung wird für die zugeordnete Tabelle ausgegeben.
Wann brauchen wir SQLite-Trigger
Sie verwenden häufig Auslöser, um eine ausgeklügelte Überwachung zu ermöglichen. Beispielsweise möchten Sie die Änderungen der sensiblen Daten wie Gehalt und Adresse bei jeder Änderung protokollieren.
Darüber hinaus setzen Sie Trigger ein, um komplexe Geschäftsregeln zentral auf Datenbankebene durchzusetzen und ungültige Transaktionen zu verhindern.
SQLite CREATE TRIGGER
Erklärung
Um einen neuen Trigger in SQLite zu erstellen, verwenden Sie den CREATE TRIGGER
Anweisung wie folgt:
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)
In dieser Syntax:
- Spezifizieren Sie zuerst den Namen des Triggers nach dem
CREATE TRIGGER
Schlüsselwörter. - Bestimmen Sie als Nächstes, wann der Trigger ausgelöst wird, z. B.
BEFORE
,AFTER
, oderINSTEAD OF
. Sie könnenBEFORE
erstellen undAFTER
Trigger auf einem Tisch. Sie können jedoch nur einenINSTEAD OF
erstellen bei einer Ansicht auslösen. - Geben Sie dann das Ereignis an, das bewirkt, dass der Trigger aufgerufen wird, z. B.
INSERT
,UPDATE
, oderDELETE
. - Geben Sie danach die Tabelle an, zu der der Trigger gehört.
- Zum Schluss platzieren Sie die Trigger-Logik im
BEGIN END
-Block, bei dem es sich um beliebige gültige SQL-Anweisungen handeln kann.
Wenn Sie den Zeitpunkt, zu dem der Trigger ausgelöst wird, und das Ereignis, das das Auslösen des Triggers verursacht, kombinieren, haben Sie insgesamt 9 Möglichkeiten:
BEFORE INSERT
AFTER INSERT
BEFORE UPDATE
AFTER UPDATE
BEFORE DELETE
AFTER DELETE
INSTEAD OF INSERT
INSTEAD OF DELETE
INSTEAD OF UPDATE
Angenommen, Sie verwenden ein UPDATE
Anweisung zum Aktualisieren von 10 Zeilen in einer Tabelle, wird der Trigger, der der Tabelle zugeordnet ist, 10 Mal ausgelöst. Dieser Trigger heißt FOR EACH ROW
Abzug. Wenn der der Tabelle zugeordnete Trigger einmal ausgelöst wird, nennen wir diesen Trigger einen FOR EACH STATEMENT
auslösen.
Ab Version 3.9.2 unterstützt SQLite nur noch FOR EACH ROW
löst aus. FOR EACH STATEMENT
wurde noch nicht unterstützt Auslöser.
Wenn Sie eine Bedingung im WHEN
verwenden -Klausel wird der Trigger nur aufgerufen, wenn die Bedingung wahr ist. Falls Sie den WHEN
weglassen -Klausel wird der Trigger für alle Zeilen ausgeführt.
Beachten Sie, dass beim Löschen einer Tabelle auch alle zugehörigen Trigger gelöscht werden. Wenn der Trigger jedoch auf andere Tabellen verweist, wird der Trigger nicht entfernt oder geändert, wenn andere Tabellen entfernt oder aktualisiert werden.
Beispielsweise verweist ein Trigger auf eine Tabelle mit dem Namen people
, lassen Sie die people
fallen Tabelle oder umbenennen, müssen Sie die Definition des Triggers manuell ändern.
Mit OLD
können Sie auf die Daten der Zeile zugreifen, die eingefügt, gelöscht oder aktualisiert wird und NEW
Verweise in der Form:OLD.column_name
und NEW.column_name
.
der OLD
und NEW
Referenzen sind je nach Ereignis verfügbar, das das Auslösen des Triggers verursacht.
Die folgende Tabelle veranschaulicht die Regeln.:
Aktion | Referenz |
---|---|
EINFÜGEN | NEU ist verfügbar |
AKTUALISIEREN | Sowohl NEU als auch ALT sind verfügbar |
LÖSCHEN | ALT ist verfügbar |
Beispiele für SQLite-Trigger
Lassen Sie uns eine neue Tabelle namens Leads erstellen, um alle Geschäftskontakte des Unternehmens zu speichern.
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
Auslöserbeispiel
Angenommen, Sie möchten die E-Mail-Adresse validieren, bevor Sie einen neuen Lead in die leads
einfügen Tisch. In diesem Fall können Sie ein BEFORE INSERT
verwenden auslösen.
Erstellen Sie zuerst einen BEFORE INSERT
wie folgt auslösen:
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)
Wir haben den NEW
verwendet Referenz für den Zugriff auf die E-Mail-Spalte der Zeile, die eingefügt wird.
Um die E-Mail zu validieren, haben wir den LIKE
verwendet Operator, um anhand des E-Mail-Musters zu bestimmen, ob die E-Mail gültig ist oder nicht. Wenn die E-Mail ungültig ist, wird der RAISE
Funktion bricht das Einfügen ab und gibt eine Fehlermeldung aus.
Zweitens fügen Sie eine Zeile mit einer ungültigen E-Mail in die leads
ein Tabelle.
INSERT INTO leads (first_name,last_name,email,phone)
VALUES('John','Doe','jjj','4089009334');
Code language: SQL (Structured Query Language) (sql)
SQLite hat einen Fehler ausgegeben:„Ungültige E-Mail-Adresse“ und die Ausführung der Einfügung abgebrochen.
Drittens fügen Sie eine Zeile mit einer gültigen E-Mail-Adresse ein.
INSERT INTO leads (first_name, last_name, email, phone)
VALUES ('John', 'Doe', '[email protected]', '4089009334');
Code language: SQL (Structured Query Language) (sql)
Da die E-Mail gültig ist, wurde die Insert-Anweisung erfolgreich ausgeführt.
SELECT
first_name,
last_name,
email,
phone
FROM
leads;
Code language: SQL (Structured Query Language) (sql)
2) SQLite AFTER UPDATE
Auslöserbeispiel
Die Telefone und E-Mails der Leads sind so wichtig, dass Sie es sich nicht leisten können, diese Informationen zu verlieren. Beispielsweise aktualisiert jemand versehentlich die E-Mail-Adresse oder Telefonnummer auf die falschen oder löscht sie sogar.
Um diese wertvollen Daten zu schützen, verwenden Sie einen Trigger, um alle Änderungen zu protokollieren, die an Telefon und E-Mail vorgenommen werden.
Erstellen Sie zunächst eine neue Tabelle mit dem Namen lead_logs
um die historischen Daten zu speichern.
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)
Zweitens erstellen Sie ein AFTER UPDATE
auslösen, um Daten in lead_logs
zu protokollieren Tabelle, wenn es eine Aktualisierung in der email
gibt oder phone
Spalte.
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)
Das merkt man an der Bedingung im WHEN
-Klausel gibt an, dass der Trigger nur aufgerufen wird, wenn es eine Änderung in der E-Mail- oder Telefonspalte gibt.
Drittens aktualisieren Sie den Nachnamen von John
von Doe
an Smith
.
UPDATE leads
SET
last_name = 'Smith'
WHERE
id = 1;
Code language: SQL (Structured Query Language) (sql)
Der Auslöser log_contact_after_update
wurde nicht aufgerufen, da sich E-Mail oder Telefon nicht geändert haben.
Viertens, aktualisieren Sie E-Mail und Telefon von John
zu den Neuen.
UPDATE leads
SET
phone = '4089998888',
email = '[email protected]'
WHERE
id = 1;
Code language: SQL (Structured Query Language) (sql)
Wenn Sie die Protokolltabelle überprüfen, sehen Sie dort einen neuen Eintrag.
SELECT
old_phone,
new_phone,
old_email,
new_email,
user_action
FROM
lead_logs;
Code language: SQL (Structured Query Language) (sql)
Sie können den AFTER INSERT
entwickeln und AFTER DELETE
löst aus, die Daten in den lead_logs
zu protokollieren Tabelle als Übung.
SQLite DROP TRIGGER
Erklärung
Um einen bestehenden Trigger zu löschen, verwenden Sie den DROP TRIGGER
Anweisung wie folgt:
DROP TRIGGER [IF EXISTS] trigger_name;
Code language: SQL (Structured Query Language) (sql)
In dieser Syntax:
- Geben Sie zuerst den Namen des Triggers an, den Sie nach dem
DROP TRIGGER
löschen möchten Schlüsselwörter. - Als Zweites verwenden Sie den
IF EXISTS
Option, den Trigger nur zu löschen, wenn er existiert.
Beachten Sie, dass SQLite beim Löschen einer Tabelle automatisch alle Trigger löschen wird, die der Tabelle zugeordnet sind.
Zum Beispiel, um validate_email_before_insert_leads
zu entfernen Trigger verwenden Sie die folgende Anweisung:
DROP TRIGGER validate_email_before_insert_leads;
Code language: SQL (Structured Query Language) (sql)
In diesem Tutorial haben wir Ihnen SQLite-Trigger vorgestellt und zeigen Ihnen, wie Sie Trigger aus der Datenbank erstellen und löschen.