Sqlite 简明教程

SQLite - Triggers

SQLite Triggers 是数据库回调函数,当指定的数据库事件发生时自动执行/调用。以下是有关 SQLite 触发器的重要说明 -

  1. 可以指定 SQLite 触发器,以便在对特定数据库表进行 DELETE、INSERT 或 UPDATE 操作或在对表的某个或多个指定列进行 UPDATE 操作时触发,或在对表的某个或多个指定列进行 UPDATE 操作时触发。

  2. 目前,SQLite 仅支持 EVERY ROW 触发器,不支持 FOR EACH STATEMENT 触发器。因此,可以有选择地指定 FOR EACH ROW。

  3. WHEN 子句和触发器操作都可以访问正在插入、删除或更新的行,并使用以下形式的引用 NEW.column-nameOLD.column-name ,其中 column-name 是触发器所关联的表中列的名称。

  4. 如果提供了 WHEN 子句,则仅对 WHEN 子句为真的行执行指定的 SQL 语句。如果未提供 WHEN 子句,则对所有行执行 SQL 语句。

  5. BEFORE 或 AFTER 关键字确定触发器操作何时相对于关联行的插入、修改或删除执行。

  6. 当与其关联的表被删除时,触发器会自动被删除。

  7. 要修改的表必须存在于与触发器附加的表或视图相同的数据库中,并且只能使用 tablename ,而不是 database.tablename

  8. 可以在触发器程序内使用特殊 SQL 函数 RAISE() 来触发异常。

Syntax

这是创建 trigger 的基本语法。

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

此处, event_name 可以在所述表 table_name 上是插入,删除和更新数据库操作。您可以在表名后选择指定 FOR EACH ROW。

以下是在表的某个或多个指定列上针对更新操作创建触发器的语法。

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

Example

让我们考虑这种情况,我们希望保留表 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
);

要保留审核记录,我们将创建一个名为 AUDIT 的新表,其中会在 COMPANY 表中出现新记录的任何时候插入日志消息。

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

此处,ID 是 AUDIT 记录 ID,EMP_ID 是自 COMPANY 表而来的 ID,DATE 将会在 COMPANY 表中创建记录时保留时间戳。现在,让我们如下创建 COMPANY 表上的触发器 −

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

现在,我们将开始实际工作,让我们开始在 COMPANY 表中插入记录,该记录应该导致在 AUDIT 表中创建一个审核记录。如下在 COMPANY 表中创建一个记录 −

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

这将在 COMPANY 表中创建一个如下所示的记录 −

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

同时,将在 AUDIT 表中创建一个记录。此记录是在 COMPANY 表中针对插入操作创建的触发器的结果。同样,您可以根据要求针对更新和删除操作创建触发器。

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

Listing Triggers

如下可以在 sqlite_master 表中列出所有触发器 −

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

上述 SQLite 语句将仅如下列出一个条目 −

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

如果您想列出特定表上的触发器,请使用 AND 子句与表名一起使用,如下所示 −

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

上述 SQLite 语句也将仅如下列出一个条目 −

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

Dropping Triggers

以下是 DROP 命令,它可用来删除现有触发器。

sqlite> DROP TRIGGER trigger_name;