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
, oINSTEAD OF
. Puedes crearBEFORE
yAFTER
gatillos en una mesa. Sin embargo, solo puede crear unINSTEAD OF
activar en una vista. - Luego, especifique el evento que hace que se invoque el activador, como
INSERT
,UPDATE
oDELETE
. - 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.