Sqlite 简明教程
SQLite - Triggers
SQLite Triggers 是数据库回调函数,当指定的数据库事件发生时自动执行/调用。以下是有关 SQLite 触发器的重要说明 -
-
可以指定 SQLite 触发器,以便在对特定数据库表进行 DELETE、INSERT 或 UPDATE 操作或在对表的某个或多个指定列进行 UPDATE 操作时触发,或在对表的某个或多个指定列进行 UPDATE 操作时触发。
-
目前,SQLite 仅支持 EVERY ROW 触发器,不支持 FOR EACH STATEMENT 触发器。因此,可以有选择地指定 FOR EACH ROW。
-
WHEN 子句和触发器操作都可以访问正在插入、删除或更新的行,并使用以下形式的引用 NEW.column-name 和 OLD.column-name ,其中 column-name 是触发器所关联的表中列的名称。
-
如果提供了 WHEN 子句,则仅对 WHEN 子句为真的行执行指定的 SQL 语句。如果未提供 WHEN 子句,则对所有行执行 SQL 语句。
-
BEFORE 或 AFTER 关键字确定触发器操作何时相对于关联行的插入、修改或删除执行。
-
当与其关联的表被删除时,触发器会自动被删除。
-
要修改的表必须存在于与触发器附加的表或视图相同的数据库中,并且只能使用 tablename ,而不是 database.tablename 。
-
可以在触发器程序内使用特殊 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