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>

以上面查詢的結果中,可以看到已建立的兩個觸發器。