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 TRIGGERSchlüsselwörter. - Bestimmen Sie als Nächstes, wann der Trigger ausgelöst wird, z. B.
BEFORE,AFTER, oderINSTEAD OF. Sie könnenBEFOREerstellen undAFTERTrigger auf einem Tisch. Sie können jedoch nur einenINSTEAD OFerstellen 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 INSERTAFTER INSERTBEFORE UPDATEAFTER UPDATEBEFORE DELETEAFTER DELETEINSTEAD OF INSERTINSTEAD OF DELETEINSTEAD 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', 'john.doe@sqlitetutorial.net', '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 = 'john.smith@sqlitetutorial.net'
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 TRIGGERlöschen möchten Schlüsselwörter. - Als Zweites verwenden Sie den
IF EXISTSOption, 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.