SQLite - Desencadenadores

SQLite Triggersson funciones de devolución de llamada de la base de datos, que se ejecutan / invocan automáticamente cuando se produce un evento de base de datos específico. Los siguientes son los puntos importantes sobre los desencadenantes de SQLite:

  • Se puede especificar que el disparador de SQLite se active siempre que se produzca un DELETE, INSERT o UPDATE de una tabla de base de datos en particular o cuando se produzca una ACTUALIZACIÓN en una o más columnas especificadas de una tabla.

  • En este momento, SQLite solo admite activadores FOR CADA FILA, no activadores FOR CADA DECLARACIÓN. Por lo tanto, especificar explícitamente PARA CADA FILA es opcional.

  • Tanto la cláusula WHEN como las acciones desencadenantes pueden acceder a elementos de la fila que se inserta, elimina o actualiza utilizando referencias del formulario NEW.column-name y OLD.column-name, donde nombre-columna es el nombre de una columna de la tabla con la que está asociado el desencadenador.

  • Si se proporciona una cláusula WHEN, las sentencias SQL especificadas solo se ejecutan para las filas para las que la cláusula WHEN es verdadera. Si no se proporciona una cláusula WHEN, las sentencias SQL se ejecutan para todas las filas.

  • La palabra clave BEFORE o AFTER determina cuándo se ejecutarán las acciones de activación en relación con la inserción, modificación o eliminación de la fila asociada.

  • Los activadores se eliminan automáticamente cuando se elimina la tabla a la que están asociados.

  • La tabla que se va a modificar debe existir en la misma base de datos que la tabla o vista a la que se adjunta el disparador y se debe usar solo tablename no database.tablename.

  • Se puede usar una función SQL especial RAISE () dentro de un programa de activación para generar una excepción.

Sintaxis

A continuación se muestra la sintaxis básica para crear un trigger.

CREATE TRIGGER trigger_name [BEFORE|AFTER] event_name 
ON table_name
BEGIN
 -- Trigger logic goes here....
END;

Aquí, event_namepodría ser INSERT, DELETE y UPDATE la operación de base de datos en la tabla mencionadatable_name. Opcionalmente, puede especificar PARA CADA FILA después del nombre de la tabla.

A continuación se muestra la sintaxis para crear un desencadenante en una operación UPDATE en una o más columnas especificadas de una tabla.

CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name 
ON table_name
BEGIN
   -- Trigger logic goes here....
END;

Ejemplo

Consideremos un caso en el que queremos mantener una prueba de auditoría para cada registro que se inserta en la tabla EMPRESA, que creamos de la siguiente manera (elimine la tabla EMPRESA si ya la tiene).

sqlite> CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

Para mantener la prueba de auditoría, crearemos una nueva tabla llamada AUDIT donde se insertarán los mensajes de registro, siempre que haya una entrada en la tabla EMPRESA para un nuevo registro.

sqlite> CREATE TABLE AUDIT(
   EMP_ID INT NOT NULL,
   ENTRY_DATE TEXT NOT NULL
);

Aquí, ID es el ID de registro de AUDIT, y EMP_ID es el ID que vendrá de la tabla COMPANY y DATE mantendrá la marca de tiempo cuando se creará el registro en la tabla COMPANY. Ahora creemos un disparador en la tabla EMPRESA de la siguiente manera:

sqlite> CREATE TRIGGER audit_log AFTER INSERT 
ON COMPANY
BEGIN
   INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, datetime('now'));
END;

Ahora, comenzaremos el trabajo real. Comencemos a insertar un registro en la tabla EMPRESA, lo que debería resultar en la creación de un registro de auditoría en la tabla AUDIT. Cree un registro en la tabla EMPRESA de la siguiente manera:

sqlite> INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Paul', 32, 'California', 20000.00 );

Esto creará un registro en la tabla EMPRESA, que es el siguiente:

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0

Al mismo tiempo, se creará un registro en la tabla AUDIT. Este registro es el resultado de un desencadenante, que hemos creado en la operación INSERTAR en la tabla EMPRESA. Del mismo modo, puede crear sus activadores en las operaciones ACTUALIZAR y ELIMINAR según sus requisitos.

EMP_ID      ENTRY_DATE
----------  -------------------
1           2013-04-05 06:26:00

Listado de activadores

Puede enumerar todos los desencadenantes de sqlite_master tabla de la siguiente manera:

sqlite> SELECT name FROM sqlite_master
WHERE type = 'trigger';

La declaración SQLite anterior enumerará solo una entrada de la siguiente manera:

name
----------
audit_log

Si desea enumerar los desencadenadores en una tabla en particular, use la cláusula AND con el nombre de la tabla de la siguiente manera:

sqlite> SELECT name FROM sqlite_master
WHERE type = 'trigger' AND tbl_name = 'COMPANY';

La declaración SQLite anterior también enumerará solo una entrada de la siguiente manera:

name
----------
audit_log

Soltar disparadores

A continuación se muestra el comando DROP, que se puede usar para eliminar un disparador existente.

sqlite> DROP TRIGGER trigger_name;