SQLite触发器(插入之前/之后)

SQLite触发器(插入之前/之后)

SQLite插入之前或之后触发器指定了如何在插入数据后创建触发器。 假设有两个表:COMPANYAUDIT,在这里要对向COMPANY表中插入的每条记录进行审计。如果您已经有创建过一个COMPANY表,请将其删除并重新创建。

COMPANY的创建语句 -

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

创建一个名为AUDIT的新表,只要在向COMPANY表中插入新记录,就会插入日志消息:

AUDIT的创建语句 -

CREATE TABLE audit(  
    EMP_ID INT NOT NULL,
    ACTION_TYPE TEXT NOT NULL,
    ENTRY_DATE TEXT NOT NULL  
);

创建以上两个表,如下图所示 -

SQLite触发器:AFTER INSERT

在插入操作后,使用以下语法是在COMPANY表上创建名为“audit_log”的触发器。

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

这里,IDAUDIT表行记录的IDEMP_ID是来自COMPANY表的IDDATE字段是用于在COMPANY表中创建记录时保留时间戳。

现在向COMPANY表中插入一些记录,触发器将自动在AUDIT表中创建审核日志记录。

INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)  
VALUES (1, 'Maxsu', 22, 'Haikou', 40000.00);

执行上面语句后,同时会在AUDIT表中创建一条记录。 这只是因为在COMPANY表上的INSERT操作上创建的触发器。现在查询AUDIT表中的记录数据。

SELECT * FROM AUDIT;

执行上面语句,结果如下所示 -

如何列出/查看触发器?

可以使用查询语句从sqlite_master表中来查询列出/查看触发器。

SELECT name FROM sqlite_master  
WHERE type = 'trigger';

执行上面语句,得到以下结果 -

从上面结果中,可以看到触发器的名称。还可以使用AND子句列出特定表上的触发器。

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

执行上面查询,得到以下结果 -

SQLite触发器:BEFORE INSERT

如果要在插入数据之前创建触发器,可以使用以下语句 -

CREATE TRIGGER befor_ins BEFORE INSERT   
ON COMPANY  
BEGIN  
INSERT INTO AUDIT(EMP_ID, ACTION_TYPE ,ENTRY_DATE) VALUES (new.ID, 'BEFORE INSERT', datetime('now'));  
END;

创建完成上面的触发器后,现在向COMPANY表中插入一条数据记录。

INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)  
VALUES (2, 'Minsu', 28, 'Guangzhou', 35000.00);
``

现在,已经创建了两个触发器,一个是**BEFORE INSERT**,另一个是:**AFTER INSERT**,因此在向`COMPANY`表插入第二条记录时,`AUDIT`表中有生成两个记录。

```sql
SELECT * FROM AUDIT;

检查创建的触发器:

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

执行上面语句,得到以下结果 -

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

以上面查询的结果中,可以看到已创建的两个触发器。


目录

SQLite主键