SQLite觸發器(更新之前/之後)
SQLite觸發器(更新之前/之後)指定了如何在更新數據後執行觸發器操作。 假設有兩個表company
和audit
,在這裏要對在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;
注意:上面的兩個關鍵字:
new
和old
,它們分別表示新插入的行記錄和表中已存在行記錄。
現在更新一條記錄數據,如下:
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';
執行上面語句,得到以下結果 -