SQLite觸發器(更新之前/之後)


SQLite觸發器(更新之前/之後)指定了如何在更新資料後執行觸發器操作。 假設有兩個表companyaudit,在這裡要對在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表中有更新時插入紀錄檔訊息。

CREATE TABLE audit(  
    EMP_ID INT NOT NULL,
    ACTION_TYPE TEXT NOT NULL,
    ENTRY_DATE TEXT NOT NULL  
);

建立更新後的觸發器:

使用以下語法建立名為「after_up」的觸發器,在COMPANY表上更新操作後觸發此觸發器。

CREATE TRIGGER after_up AFTER UPDATE   
ON COMPANY  
BEGIN  
INSERT INTO AUDIT(EMP_ID, ACTION_TYPE, ENTRY_DATE) VALUES (new.ID, 'AFTER UPDATE', datetime('now'));  
END;

現在更新一條記錄資料,如下:

UPDATE COMPANY SET ADDRESS = 'Shenzhen' WHERE ID = 1;

檢視已建立的觸發器 -

SELECT name FROM sqlite_master  WHERE type = 'trigger';

執行上面語句,看到以下結果 -

SQLite觸發器:在UPDATE之前

如果要建立在更新資料之前的觸發器,請參考以下語句 -

CREATE TRIGGER befor_up BEFORE UPDATE   
ON COMPANY  
BEGIN  
INSERT INTO AUDIT(EMP_ID, ACTION_TYPE, ENTRY_DATE) VALUES (new.ID, old.ADDRESS , datetime('now'));  
END;

注意:上面的兩個關鍵字:newold,它們分別表示新插入的行記錄和表中已存在行記錄。

現在更新一條記錄資料,如下:

UPDATE COMPANY SET ADDRESS = 'Beijing' WHERE ID = 1;

查詢審計表:audit中的記錄資訊,如下所示 -

sqlite> select * from audit;
1|AFTER INSERT|2017-05-25 13:39:32
2|BEFORE INSERT|2017-05-25 13:41:50
2|AFTER INSERT|2017-05-25 13:41:50
1|AFTER UPDATE|2017-05-25 14:14:00
1|Shenzhen|2017-05-25 14:18:19 -- 使用舊行的Address值寫入
1|AFTER UPDATE|2017-05-25 14:18:19
sqlite>

執行上面語句建立觸發器,檢視上面建立的觸發器 -

SELECT name FROM sqlite_master  WHERE type = 'trigger';

執行上面語句,得到以下結果 -