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 TRIGGERtrefwoorden. - Bepaal vervolgens wanneer de trigger wordt geactiveerd, zoals
BEFORE,AFTER, ofINSTEAD OF. U kuntBEFORE. maken enAFTERtriggers op een tafel. U kunt echter alleen eenINSTEAD OFtrigger op een weergave. - Geef vervolgens de gebeurtenis op die ervoor zorgt dat de trigger wordt aangeroepen, zoals
INSERT,UPDATE, ofDELETE. - Geef daarna de tabel aan waartoe de trigger behoort.
- Plaats tot slot de triggerlogica in de
BEGIN ENDblok, 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 INSERTAFTER INSERTBEFORE UPDATEAFTER UPDATEBEFORE DELETEAFTER DELETEINSTEAD OF INSERTINSTEAD OF DELETEINSTEAD 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', 'john.doe@sqlitetutorial.net', '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 = 'john.smith@sqlitetutorial.net'
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 TRIGGERtrefwoorden. - Ten tweede, gebruik de
IF EXISTSoptie 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.