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

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

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

如果要在插入數(shù)據(jù)之前創(chuàng)建觸發(fā)器,可以使用以下語句 -
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)建了兩個觸發(fā)器,一個是**BEFORE INSERT**,另一個是:**AFTER INSERT**,因此在向`COMPANY`表插入第二條記錄時,`AUDIT`表中有生成兩個記錄。
```sql
SELECT * FROM AUDIT;

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