English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Gatilho (Trigger) do SQLite

Os gatilhos (Trigger) do SQLite são funções de callback do banco de dados, que são executadas automaticamente quando ocorrem eventos de banco de dados especificados/Chame essas funções. A seguir estão os pontos principais sobre os gatilhos (Trigger) do SQLite-

  • Os gatilhos (Trigger) do SQLite podem ser especificados para acionar em eventos específicos de banco de dados, como DELETE, INSERT ou UPDATE em uma tabela específica, ou quando uma ou mais colunas específicas em uma ou mais tabelas são atualizadas.

  • O SQLite suporta apenas gatilhos (Trigger) FOR EACH ROW, sem gatilhos (Trigger) FOR EACH STATEMENT. Portanto, a especificação explícita de FOR EACH ROW é opcional.

  • WHEN 子句和触发器(Trigger)动作可能访问使用表单 NEW.column-nameOLD.column-name 的引用插入、删除或更新的行元素,其中 column-name 是从与触发器关联的表的列的名称。

  • 如果提供 WHEN 子句,则只针对 WHEN 子句为真的指定行执行 SQL 语句。如果没有提供 WHEN 子句,则针对所有行执行 SQL 语句。

  • BEFORE 或 AFTER 关键字决定何时执行触发器动作,决定是在关联行的插入、修改或删除之前或者之后执行触发器动作。

  • 当触发器相关联的表删除时,自动删除触发器(Trigger)。

  • 要修改的表必须存在于同一数据库中,作为触发器被附加的表或视图,且必须只使用 tablename,而不是 database.tablename

  • 一个特殊的 SQL 函数 RAISE() 可用于触发器程序内抛出异常。

语法

以下是创建trigger的基本语法。

CREATE  TRIGGER trigger_name [BEFORE|AFTER] event_name 
ON table_name
BEGIN
 -- 触发器逻辑....
END;

在这里,event_name可以是对上述表的INSERT,DELETEUPDATE数据库操作table_name。您可以选择在表名称后指定FOR EACH ROW。

以下是在表的一个或多个指定列上的UPDATE操作上创建触发器的语法。

CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name 
ON table_name
BEGIN
   -- 触发逻辑在这里....
END;

示例

让我们考虑一种情况,我们希望对插入到COMPANY表中的每条记录进行审计试用,这是我们新创建的,如下所示(如果已经有了,则删除COMPANY表)。

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

Para manter o estado de auditoria, sempre que houver uma nova entrada de registro na tabela COMPANY, criaremos uma nova tabela chamada AUDIT, na qual inseriremos as mensagens de log.

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

Aqui, ID é o ID do registro AUDIT, EMP_ID é o ID proveniente da tabela COMPANY, DATE mantém o carimbo de tempo quando é criado um registro na tabela COMPANY. Agora vamos criar um gatilho na tabela COMPANY, conforme mostrado a seguir:

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

Agora, vamos começar com o trabalho real, vamos começar a inserir registros na tabela COMPANY, o que causará a criação de um registro de log de auditoria na tabela AUDIT. Crie um registro na tabela COMPANY, conforme mostrado a seguir-

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

Isso criará um registro na tabela COMPANY, conforme mostrado a seguir-

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

Ao mesmo tempo, um registro será criado na tabela AUDIT. Este registro é o resultado do gatilho que criamos na operação INSERT na tabela COMPANY. Da mesma forma, você pode criar gatilhos nas operações UPDATE e DELETE conforme necessário.

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

listar gatilhos

Você pode pegarsqlite_masterA tabela lista todos os gatilhos, conforme mostrado a seguir:

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

A seguinte instrução SQLite listará apenas uma entrada, conforme mostrado a seguir-

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

Se desejar listar os gatilhos de uma tabela específica, use a cláusula AND juntamente com o nome da tabela, conforme mostrado a seguir:

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

A seguinte declaração SQLite listará apenas uma entrada, conforme mostrado a seguir-

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

Exclusão de Triggers

A seguir está o comando DROP, que pode ser usado para excluir triggers existentes.

sqlite> DROP TRIGGER trigger_name;