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 TRIGGER
mots-clés. - Ensuite, déterminez quand le déclencheur est déclenché, par exemple
BEFORE
,AFTER
, ouINSTEAD OF
. Vous pouvez créerBEFORE
etAFTER
déclencheurs sur une table. Cependant, vous ne pouvez créer qu'unINSTEAD OF
dé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 END
bloc, 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 INSERT
AFTER INSERT
BEFORE UPDATE
AFTER UPDATE
BEFORE DELETE
AFTER DELETE
INSTEAD OF INSERT
INSTEAD OF DELETE
INSTEAD 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', '[email protected]', '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 = '[email protected]'
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 TRIGGER
mots-clés. - Deuxièmement, utilisez le
IF EXISTS
option 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.