SQLite
 sql >> Datenbank >  >> RDS >> SQLite

SQLite-Trigger

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 , oder INSTEAD OF . Sie können BEFORE erstellen und AFTER Trigger auf einem Tisch. Sie können jedoch nur einen INSTEAD OF erstellen bei einer Ansicht auslösen.
  • Geben Sie dann das Ereignis an, das bewirkt, dass der Trigger aufgerufen wird, z. B. INSERT , UPDATE , oder DELETE .
  • 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.