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
, ofINSTEAD OF
. U kuntBEFORE
. maken enAFTER
triggers op een tafel. U kunt echter alleen eenINSTEAD OF
trigger 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 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.