sql >> Database >  >> RDS >> SQLite

SQLite-trigger

Samenvatting :deze tutorial bespreekt SQLite-trigger, een database-object dat automatisch wordt geactiveerd wanneer de gegevens in een tabel worden gewijzigd.

Wat is een SQLite-trigger

Een SQLite-trigger is een benoemd database-object dat automatisch wordt uitgevoerd wanneer een INSERT , UPDATE of DELETE verklaring wordt afgegeven tegen de bijbehorende tabel.

Wanneer hebben we SQLite-triggers nodig

Je gebruikt vaak triggers om geavanceerde auditing mogelijk te maken. U wilt bijvoorbeeld de wijzigingen in de gevoelige gegevens zoals salaris en adres loggen wanneer deze veranderen.

Daarnaast gebruik je triggers om complexe bedrijfsregels centraal op databaseniveau af te dwingen en ongeldige transacties te voorkomen.

SQLite CREATE TRIGGER verklaring

Om een ​​nieuwe trigger in SQLite aan te maken, gebruik je de CREATE TRIGGER verklaring als volgt:

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 deze syntaxis:

  • Geef eerst de naam van de trigger op na de CREATE TRIGGER trefwoorden.
  • Bepaal vervolgens wanneer de trigger wordt geactiveerd, zoals BEFORE , AFTER , of INSTEAD OF . U kunt BEFORE . maken en AFTER triggers op een tafel. U kunt echter alleen een INSTEAD OF trigger op een weergave.
  • Geef vervolgens de gebeurtenis op die ervoor zorgt dat de trigger wordt aangeroepen, zoals INSERT , UPDATE , of DELETE .
  • Geef daarna de tabel aan waartoe de trigger behoort.
  • Plaats tot slot de triggerlogica in de BEGIN END blok, wat alle geldige SQL-instructies kunnen zijn.

Als je de tijd waarop de trigger wordt geactiveerd combineert met de gebeurtenis die ervoor zorgt dat de trigger wordt geactiveerd, heb je in totaal 9 mogelijkheden:

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

Stel dat u een UPDATE . gebruikt statement om 10 rijen in een tabel bij te werken, wordt de trigger die aan de tabel is gekoppeld 10 keer geactiveerd. Deze trigger heet FOR EACH ROW trekker. Als de trigger die aan de tabel is gekoppeld één keer wordt geactiveerd, noemen we deze trigger een FOR EACH STATEMENT trigger.

Vanaf versie 3.9.2 ondersteunt SQLite alleen FOR EACH ROW triggers. Het heeft nog niet de FOR EACH STATEMENT . ondersteund triggers.

Als u een voorwaarde gebruikt in de WHEN clausule, wordt de trigger alleen aangeroepen als de voorwaarde waar is. Als u de WHEN . weglaat clausule, wordt de trigger uitgevoerd voor alle rijen.

Merk op dat als u een tabel laat vallen, alle bijbehorende triggers ook worden verwijderd. Als de trigger echter verwijst naar andere tabellen, wordt de trigger niet verwijderd of gewijzigd als andere tabellen worden verwijderd of bijgewerkt.

Een trigger verwijst bijvoorbeeld naar een tabel met de naam people , laat je de people vallen tabel of de naam ervan wijzigen, moet u de definitie van de trigger handmatig wijzigen.

U kunt toegang krijgen tot de gegevens van de rij die wordt ingevoegd, verwijderd of bijgewerkt met de OLD en NEW referenties in de vorm:OLD.column_name en NEW.column_name .

de OLD en NEW referenties zijn beschikbaar afhankelijk van de gebeurtenis waardoor de trigger wordt geactiveerd.

De volgende tabel illustreert de regels.:

Actie Referentie
INSERT NIEUW is beschikbaar
UPDATE Zowel NIEUW als OUD zijn beschikbaar
VERWIJDEREN OUD is beschikbaar

SQLite triggers voorbeelden

Laten we een nieuwe tabel maken met de naam leads om alle zakelijke leads van het bedrijf op te slaan.

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 triggervoorbeeld

Stel dat u het e-mailadres wilt valideren voordat u een nieuwe lead invoegt in de leads tafel. In dit geval kunt u een BEFORE INSERT . gebruiken trigger.

Maak eerst een BEFORE INSERT trigger als volgt:

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)

We gebruikten de NEW verwijzing om toegang te krijgen tot de e-mailkolom van de rij die wordt ingevoegd.

Om de e-mail te valideren, gebruikten we de LIKE operator om te bepalen of de e-mail geldig is of niet op basis van het e-mailpatroon. Als de e-mail niet geldig is, wordt de RAISE functie breekt het invoegen af ​​en geeft een foutmelding.

Ten tweede, voeg een rij in met een ongeldig e-mailadres in de leads tafel.

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

SQLite gaf een foutmelding:"Ongeldig e-mailadres" en stopte de uitvoering van de invoeging.

Ten derde, voeg een rij in met een geldig e-mailadres.

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

Omdat de e-mail geldig is, is het insert-statement succesvol uitgevoerd.

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

2) SQLite AFTER UPDATE triggervoorbeeld

De telefoons en e-mails van de leads zijn zo belangrijk dat u het zich niet kunt veroorloven deze informatie te verliezen. Iemand werkt bijvoorbeeld per ongeluk de e-mail of telefoon bij naar de verkeerde of verwijdert deze zelfs.

Om deze waardevolle gegevens te beschermen, gebruikt u een trigger om alle wijzigingen in de telefoon en e-mail vast te leggen.

Maak eerst een nieuwe tabel met de naam lead_logs om de historische gegevens op te slaan.

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)

Ten tweede, maak een AFTER UPDATE trigger om gegevens te loggen in de lead_logs tabel wanneer er een update is in de email of phone kolom.

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)

Dat merk je in de voorwaarde in de WHEN clausule specificeert dat de trigger alleen wordt aangeroepen wanneer er een wijziging is in de e-mail- of telefoonkolom.

Ten derde, update de achternaam van John van Doe naar Smith .

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

De trigger log_contact_after_update werd niet aangeroepen omdat er geen wijziging was in e-mail of telefoon.

Ten vierde, update zowel e-mail als telefoon van John naar de nieuwe.

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

Als je de logtabel bekijkt, zul je zien dat daar een nieuw item is.

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

U kunt de AFTER INSERT . ontwikkelen en AFTER DELETE triggers om de gegevens in de lead_logs . te loggen tafel als oefening.

SQLite DROP TRIGGER verklaring

Om een ​​bestaande trigger te verwijderen, gebruik je de DROP TRIGGER verklaring als volgt:

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

In deze syntaxis:

  • Geef eerst de naam op van de trigger die u wilt verwijderen na de DROP TRIGGER trefwoorden.
  • Ten tweede, gebruik de IF EXISTS optie om de trigger alleen te verwijderen als deze bestaat.

Houd er rekening mee dat als u een tabel laat vallen, SQLite automatisch alle triggers die aan de tabel zijn gekoppeld, verwijdert.

Om bijvoorbeeld de validate_email_before_insert_leads . te verwijderen trigger, gebruik je de volgende verklaring:

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

In deze zelfstudie hebben we u kennis laten maken met SQLite-triggers en laten we u zien hoe u triggers kunt maken en verwijderen uit de database.


  1. Terugkeren van een functie met OUT-parameter

  2. PostgreSQL traag? Tips en trucs om bij de bron te komen

  3. MariaDB Backup &PostgreSQL in de cloud - ClusterControl Release 1.6.1

  4. Hoe MySQL Strikte Modus uit te schakelen