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觸發器(更新之前/之後)

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';

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

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