SQLite
 sql >> Base de données >  >> RDS >> SQLite

Déclencheur SQLite

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 , ou INSTEAD OF . Vous pouvez créer BEFORE et AFTER déclencheurs sur une table. Cependant, vous ne pouvez créer qu'un INSTEAD OF déclencheur sur une vue.
  • Ensuite, spécifiez l'événement qui provoque l'appel du déclencheur, tel que INSERT , UPDATE , ou DELETE .
  • 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.