sql >> Base de Datos >  >> RDS >> SQLite

Activador de SQLite

Resumen :este tutorial analiza el activador de SQLite, que es un objeto de base de datos que se activa automáticamente cuando se modifican los datos de una tabla.

¿Qué es un activador de SQLite?

Un activador de SQLite es un objeto de base de datos con nombre que se ejecuta automáticamente cuando INSERT , UPDATE o DELETE se emite contra la tabla asociada.

¿Cuándo necesitamos activadores de SQLite?

A menudo utiliza disparadores para habilitar auditorías sofisticadas. Por ejemplo, desea registrar los cambios en los datos confidenciales, como el salario y la dirección, siempre que cambien.

Además, utiliza activadores para aplicar reglas comerciales complejas de forma centralizada en el nivel de la base de datos y evitar transacciones no válidas.

SQLite CREATE TRIGGER declaración

Para crear un nuevo disparador en SQLite, usa el CREATE TRIGGER declaración de la siguiente manera:

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)

En esta sintaxis:

  • Primero, especifique el nombre del disparador después de CREATE TRIGGER palabras clave.
  • A continuación, determine cuándo se activa el activador, como BEFORE , AFTER , o INSTEAD OF . Puedes crear BEFORE y AFTER gatillos en una mesa. Sin embargo, solo puede crear un INSTEAD OF activar en una vista.
  • Luego, especifique el evento que hace que se invoque el activador, como INSERT , UPDATE o DELETE .
  • Después de eso, indique la tabla a la que pertenece el activador.
  • Finalmente, coloque la lógica de disparo en BEGIN END bloque, que puede ser cualquier instrucción SQL válida.

Si combina la hora en que se dispara el gatillo y el evento que hace que se dispare, tiene un total de 9 posibilidades:

  • BEFORE INSERT
  • AFTER INSERT
  • BEFORE UPDATE
  • AFTER UPDATE
  • BEFORE DELETE
  • AFTER DELETE
  • INSTEAD OF INSERT
  • INSTEAD OF DELETE
  • INSTEAD OF UPDATE

Supongamos que usa un UPDATE declaración para actualizar 10 filas en una tabla, el activador asociado con la tabla se activa 10 veces. Este disparador se llama FOR EACH ROW generar. Si el disparador asociado con la tabla se dispara una vez, llamamos a este disparador un FOR EACH STATEMENT disparador.

A partir de la versión 3.9.2, SQLite solo admite FOR EACH ROW disparadores Todavía no ha soportado el FOR EACH STATEMENT disparadores.

Si usa una condición en el WHEN cláusula, el activador solo se invoca cuando la condición es verdadera. En caso de que omita el WHEN cláusula, el activador se ejecuta para todas las filas.

Tenga en cuenta que si suelta una tabla, también se eliminan todos los activadores asociados. Sin embargo, si el disparador hace referencia a otras tablas, el disparador no se elimina ni cambia si se eliminan o actualizan otras tablas.

Por ejemplo, un disparador hace referencia a una tabla llamada people , sueltas a las people tabla o cámbiele el nombre, debe cambiar manualmente la definición del disparador.

Puede acceder a los datos de la fila que se está insertando, eliminando o actualizando usando el OLD y NEW referencias en la forma:OLD.column_name y NEW.column_name .

el OLD y NEW las referencias están disponibles según el evento que hace que se dispare el disparador.

La siguiente tabla ilustra las reglas.:

Acción Referencia
INSERTAR NUEVO está disponible
ACTUALIZAR Tanto NUEVO como ANTIGUO están disponibles
ELIMINAR OLD está disponible

Ejemplos de disparadores de SQLite

Vamos a crear una nueva tabla llamada prospectos para almacenar todos los prospectos comerciales de la empresa.

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 ejemplo de disparador

Supongamos que desea validar la dirección de correo electrónico antes de insertar un nuevo cliente potencial en los leads mesa. En este caso, puede usar un BEFORE INSERT disparador.

Primero, crea un BEFORE INSERT desencadenar de la siguiente manera:

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)

Usamos el NEW referencia para acceder a la columna de correo electrónico de la fila que se está insertando.

Para validar el correo electrónico, usamos el LIKE operador para determinar si el correo electrónico es válido o no según el patrón de correo electrónico. Si el correo electrónico no es válido, el RAISE la función aborta la inserción y emite un mensaje de error.

En segundo lugar, inserte una fila con un correo electrónico no válido en los leads mesa.

INSERT INTO leads (first_name,last_name,email,phone)
VALUES('John','Doe','jjj','4089009334');Code language: SQL (Structured Query Language) (sql)

SQLite emitió un error:"Dirección de correo electrónico no válida" y canceló la ejecución de la inserción.

Tercero, inserte una fila con un correo electrónico válido.

INSERT INTO leads (first_name, last_name, email, phone)
VALUES ('John', 'Doe', '[email protected]', '4089009334');Code language: SQL (Structured Query Language) (sql)

Debido a que el correo electrónico es válido, la declaración de inserción se ejecutó correctamente.

SELECT
	first_name,
	last_name,
	email,
	phone
FROM
	leads;Code language: SQL (Structured Query Language) (sql)

2) SQLite AFTER UPDATE ejemplo de disparador

Los teléfonos y correos electrónicos de los clientes potenciales son tan importantes que no puede permitirse el lujo de perder esta información. Por ejemplo, alguien actualiza accidentalmente el correo electrónico o el teléfono a los incorrectos o incluso los elimina.

Para proteger estos valiosos datos, utiliza un disparador para registrar todos los cambios que se realizan en el teléfono y el correo electrónico.

Primero, cree una nueva tabla llamada lead_logs para almacenar los datos históricos.

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)

En segundo lugar, cree un AFTER UPDATE activador para registrar datos en lead_logs tabla siempre que haya una actualización en el email o phone columna.

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)

Notas que en la condición en WHEN La cláusula especifica que el activador se invoca solo cuando hay un cambio en la columna de correo electrónico o teléfono.

Tercero, actualice el apellido de John de Doe a Smith .

UPDATE leads
SET 
   last_name = 'Smith'
WHERE
   id = 1;Code language: SQL (Structured Query Language) (sql)

El activador log_contact_after_update no se invocó porque no hubo cambios en el correo electrónico o el teléfono.

Cuarto, actualice el correo electrónico y el teléfono de John a los nuevos.

UPDATE leads
SET 
   phone = '4089998888',
   email = '[email protected]'
WHERE
   id = 1;Code language: SQL (Structured Query Language) (sql)

Si revisa la tabla de registro, verá que hay una nueva entrada allí.

SELECT
   old_phone, 
   new_phone, 
   old_email, 
   new_email, 
   user_action
FROM
   lead_logs;Code language: SQL (Structured Query Language) (sql)

Puede desarrollar el AFTER INSERT y AFTER DELETE disparadores para registrar los datos en lead_logs tabla como ejercicio.

SQLite DROP TRIGGER declaración

Para eliminar un activador existente, utilice el DROP TRIGGER declaración de la siguiente manera:

DROP TRIGGER [IF EXISTS] trigger_name;Code language: SQL (Structured Query Language) (sql)

En esta sintaxis:

  • Primero, especifique el nombre del activador que desea soltar después de DROP TRIGGER palabras clave.
  • Segundo, use el IF EXISTS opción para eliminar el activador solo si existe.

Tenga en cuenta que si elimina una tabla, SQLite eliminará automáticamente todos los activadores asociados con la tabla.

Por ejemplo, para eliminar validate_email_before_insert_leads disparador, usa la siguiente declaración:

DROP TRIGGER validate_email_before_insert_leads;Code language: SQL (Structured Query Language) (sql)

En este tutorial, le presentamos los disparadores de SQLite y le mostramos cómo crear y soltar disparadores desde la base de datos.