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>
以上面查詢的結果中,可以看到已建立的兩個觸發器。