SQLite插入之前或之后觸發(fā)器指定了如何在插入數(shù)據(jù)后創(chuàng)建觸發(fā)器。 假設(shè)有兩個(gè)表:COMPANY和AUDIT,在這里要對(duì)向COMPANY表中插入的每條記錄進(jìn)行審計(jì)。如果您已經(jīng)有創(chuàng)建過(guò)一個(gè)COMPANY表,請(qǐng)將其刪除并重新創(chuàng)建。
COMPANY的創(chuàng)建語(yǔ)句 -
CREATE TABLE company(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
創(chuàng)建一個(gè)名為AUDIT的新表,只要在向COMPANY表中插入新記錄,就會(huì)插入日志消息:
AUDIT的創(chuàng)建語(yǔ)句 -
CREATE TABLE audit(
EMP_ID INT NOT NULL,
ACTION_TYPE TEXT NOT NULL,
ENTRY_DATE TEXT NOT NULL
);
創(chuàng)建以上兩個(gè)表,如下圖所示 -

在插入操作后,使用以下語(yǔ)法是在COMPANY表上創(chuàng)建名為“audit_log”的觸發(fā)器。
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是來(lái)自COMPANY表的ID,DATE字段是用于在COMPANY表中創(chuàng)建記錄時(shí)保留時(shí)間戳。
現(xiàn)在向COMPANY表中插入一些記錄,觸發(fā)器將自動(dòng)在AUDIT表中創(chuàng)建審核日志記錄。
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Maxsu', 22, 'Haikou', 40000.00);
執(zhí)行上面語(yǔ)句后,同時(shí)會(huì)在AUDIT表中創(chuàng)建一條記錄。 這只是因?yàn)樵?code>COMPANY表上的INSERT操作上創(chuàng)建的觸發(fā)器?,F(xiàn)在查詢(xún)AUDIT表中的記錄數(shù)據(jù)。
SELECT * FROM AUDIT;
執(zhí)行上面語(yǔ)句,結(jié)果如下所示 -

如何列出/查看觸發(fā)器?
可以使用查詢(xún)語(yǔ)句從sqlite_master表中來(lái)查詢(xún)列出/查看觸發(fā)器。
SELECT name FROM sqlite_master
WHERE type = 'trigger';
執(zhí)行上面語(yǔ)句,得到以下結(jié)果 -
從上面結(jié)果中,可以看到觸發(fā)器的名稱(chēng)。還可以使用AND子句列出特定表上的觸發(fā)器。
SELECT name FROM sqlite_master
WHERE type = 'trigger' AND tbl_name = 'COMPANY';
執(zhí)行上面查詢(xún),得到以下結(jié)果 -

如果要在插入數(shù)據(jù)之前創(chuàng)建觸發(fā)器,可以使用以下語(yǔ)句 -
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;
創(chuàng)建完成上面的觸發(fā)器后,現(xiàn)在向COMPANY表中插入一條數(shù)據(jù)記錄。
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Minsu', 28, 'Guangzhou', 35000.00);
``
現(xiàn)在,已經(jīng)創(chuàng)建了兩個(gè)觸發(fā)器,一個(gè)是**BEFORE INSERT**,另一個(gè)是:**AFTER INSERT**,因此在向`COMPANY`表插入第二條記錄時(shí),`AUDIT`表中有生成兩個(gè)記錄。
```sql
SELECT * FROM AUDIT;

檢查創(chuàng)建的觸發(fā)器:
SELECT name FROM sqlite_master
WHERE type = 'trigger' AND tbl_name = 'COMPANY';
執(zhí)行上面語(yǔ)句,得到以下結(jié)果 -
sqlite> SELECT name FROM sqlite_master
...> WHERE type = 'trigger' AND tbl_name = 'COMPANY';
audit_log
befor_ins
sqlite>
以上面查詢(xún)的結(jié)果中,可以看到已創(chuàng)建的兩個(gè)觸發(fā)器。