SQLite插入之前或之后触发器指定了如何在插入数据后创建触发器。 假设有两个表:COMPANY
和AUDIT
,在这里要对向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 );
创建以上两个表,如下图所示 -
在插入操作后,使用以下语法是在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;
这里,ID
是AUDIT
表行记录的ID
,EMP_ID
是来自COMPANY
表的ID
,DATE
字段是用于在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';
执行上面查询,得到以下结果 -
如果要在插入数据之前创建触发器,可以使用以下语句 -
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>
以上面查询的结果中,可以看到已创建的两个触发器。