Résumé :ce didacticiel traite du déclencheur SQLite, qui est un objet de base de données déclenché automatiquement lorsque les données d'une table sont modifiées.
Qu'est-ce qu'un déclencheur SQLite
Un déclencheur SQLite est un objet de base de données nommé qui est exécuté automatiquement lorsqu'un INSERT , UPDATE ou DELETE l'instruction est émise par rapport à la table associée.
Quand avons-nous besoin de déclencheurs SQLite
Vous utilisez souvent des déclencheurs pour activer un audit sophistiqué. Par exemple, vous souhaitez enregistrer les modifications apportées aux données sensibles telles que le salaire et l'adresse chaque fois qu'elles changent.
De plus, vous utilisez des déclencheurs pour appliquer des règles métier complexes de manière centralisée au niveau de la base de données et empêcher les transactions non valides.
SQLite CREATE TRIGGER déclaration
Pour créer un nouveau déclencheur dans SQLite, vous utilisez le CREATE TRIGGER déclaration comme suit :
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) Dans cette syntaxe :
- Tout d'abord, spécifiez le nom du déclencheur après le
CREATE TRIGGERmots-clés. - Ensuite, déterminez quand le déclencheur est déclenché, par exemple
BEFORE,AFTER, ouINSTEAD OF. Vous pouvez créerBEFOREetAFTERdéclencheurs sur une table. Cependant, vous ne pouvez créer qu'unINSTEAD OFdéclencheur sur une vue. - Ensuite, spécifiez l'événement qui provoque l'appel du déclencheur, tel que
INSERT,UPDATE, ouDELETE. - Après cela, indiquez la table à laquelle appartient le déclencheur.
- Enfin, placez la logique de déclenchement dans le
BEGIN ENDbloc, qui peut être n'importe quelle instruction SQL valide.
Si vous combinez l'heure à laquelle le déclencheur est déclenché et l'événement qui provoque le déclenchement du déclencheur, vous avez un total de 9 possibilités :
BEFORE INSERTAFTER INSERTBEFORE UPDATEAFTER UPDATEBEFORE DELETEAFTER DELETEINSTEAD OF INSERTINSTEAD OF DELETEINSTEAD OF UPDATE
Supposons que vous utilisiez une UPDATE pour mettre à jour 10 lignes dans une table, le déclencheur associé à la table est déclenché 10 fois. Ce déclencheur s'appelle FOR EACH ROW gâchette. Si le déclencheur associé à la table est déclenché une fois, nous appelons ce déclencheur un FOR EACH STATEMENT déclencheur.
Depuis la version 3.9.2, SQLite ne prend en charge que FOR EACH ROW déclencheurs. Il n'a pas encore pris en charge le FOR EACH STATEMENT déclencheurs.
Si vous utilisez une condition dans le WHEN clause, le déclencheur n'est appelé que lorsque la condition est vraie. Si vous omettez le WHEN clause, le déclencheur est exécuté pour toutes les lignes.
Notez que si vous supprimez une table, tous les déclencheurs associés sont également supprimés. Cependant, si le déclencheur fait référence à d'autres tables, le déclencheur n'est pas supprimé ou modifié si d'autres tables sont supprimées ou mises à jour.
Par exemple, un déclencheur fait référence à une table nommée people , vous supprimez les people table ou la renommer, vous devez modifier manuellement la définition du déclencheur.
Vous pouvez accéder aux données de la ligne en cours d'insertion, de suppression ou de mise à jour à l'aide de OLD et NEW références sous la forme :OLD.column_name et NEW.column_name .
l'OLD et NEW les références sont disponibles en fonction de l'événement qui provoque le déclenchement du déclencheur.
Le tableau suivant illustre les règles. :
| Action | Référence |
|---|---|
| INSÉRER | NOUVEAU est disponible |
| MISE À JOUR | Le NOUVEAU et l'ANCIEN sont disponibles |
| SUPPRIMER | OLD est disponible |
Exemples de déclencheurs SQLite
Créons une nouvelle table appelée prospects pour stocker tous les prospects commerciaux de l'entreprise.
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 exemple de déclencheur
Supposons que vous souhaitiez valider l'adresse e-mail avant d'insérer un nouveau prospect dans les leads table. Dans ce cas, vous pouvez utiliser un BEFORE INSERT déclencheur.
Tout d'abord, créez un BEFORE INSERT déclencher comme suit :
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)
Nous avons utilisé le NEW référence pour accéder à la colonne email de la ligne en cours d'insertion.
Pour valider l'email, nous avons utilisé le LIKE opérateur pour déterminer si l'e-mail est valide ou non en fonction du modèle d'e-mail. Si l'email n'est pas valide, le RAISE la fonction interrompt l'insertion et émet un message d'erreur.
Deuxièmement, insérez une ligne avec un e-mail invalide dans les leads tableau.
INSERT INTO leads (first_name,last_name,email,phone)
VALUES('John','Doe','jjj','4089009334');Code language: SQL (Structured Query Language) (sql) SQLite a émis une erreur :"Adresse e-mail invalide" et a interrompu l'exécution de l'insertion.
Troisièmement, insérez une ligne avec un e-mail valide.
INSERT INTO leads (first_name, last_name, email, phone)
VALUES ('John', 'Doe', 'john.doe@sqlitetutorial.net', '4089009334');Code language: SQL (Structured Query Language) (sql) Étant donné que l'e-mail est valide, l'instruction d'insertion a été exécutée avec succès.
SELECT
first_name,
last_name,
email,
phone
FROM
leads;Code language: SQL (Structured Query Language) (sql)
2) SQLite AFTER UPDATE exemple de déclencheur
Les téléphones et les e-mails des prospects sont si importants que vous ne pouvez pas vous permettre de perdre ces informations. Par exemple, quelqu'un met accidentellement à jour l'e-mail ou le téléphone avec les mauvais ou même le supprime.
Pour protéger ces précieuses données, vous utilisez un déclencheur pour enregistrer toutes les modifications apportées au téléphone et aux e-mails.
Tout d'abord, créez une nouvelle table appelée lead_logs pour stocker les données historiques.
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)
Deuxièmement, créez un AFTER UPDATE déclencheur pour enregistrer les données dans les lead_logs table chaque fois qu'il y a une mise à jour dans le email ou phone colonne.
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)
Vous remarquez que dans la condition dans le WHEN La clause spécifie que le déclencheur est appelé uniquement lorsqu'il y a un changement dans la colonne email ou phone.
Troisièmement, mettez à jour le nom de famille de John de Doe à Smith .
UPDATE leads
SET
last_name = 'Smith'
WHERE
id = 1;Code language: SQL (Structured Query Language) (sql)
Le déclencheur log_contact_after_update n'a pas été invoqué car il n'y a eu aucun changement d'e-mail ou de téléphone.
Quatrièmement, mettez à jour l'e-mail et le téléphone de John aux nouveaux.
UPDATE leads
SET
phone = '4089998888',
email = 'john.smith@sqlitetutorial.net'
WHERE
id = 1;Code language: SQL (Structured Query Language) (sql) Si vous vérifiez le tableau des journaux, vous verrez qu'il y a une nouvelle entrée.
SELECT
old_phone,
new_phone,
old_email,
new_email,
user_action
FROM
lead_logs;Code language: SQL (Structured Query Language) (sql)
Vous pouvez développer le AFTER INSERT et AFTER DELETE déclencheurs pour enregistrer les données dans les lead_logs tableau comme exercice.
SQLite DROP TRIGGER déclaration
Pour supprimer un déclencheur existant, vous utilisez le DROP TRIGGER déclaration comme suit :
DROP TRIGGER [IF EXISTS] trigger_name;Code language: SQL (Structured Query Language) (sql) Dans cette syntaxe :
- Tout d'abord, spécifiez le nom du déclencheur que vous souhaitez supprimer après le
DROP TRIGGERmots-clés. - Deuxièmement, utilisez le
IF EXISTSoption pour supprimer le déclencheur uniquement s'il existe.
Notez que si vous supprimez une table, SQLite supprimera automatiquement tous les déclencheurs associés à la table.
Par exemple, pour supprimer le validate_email_before_insert_leads déclencheur, vous utilisez l'instruction suivante :
DROP TRIGGER validate_email_before_insert_leads;Code language: SQL (Structured Query Language) (sql) Dans ce didacticiel, nous vous avons présenté les déclencheurs SQLite et vous avons montré comment créer et supprimer des déclencheurs à partir de la base de données.