SQLite TRIGGERS/觸發器
SQLite的觸發器是數據庫的回調函數,它會自動執行/指定的數據庫事件發生時調用。以下是關於SQLite的觸發器的要點:
-
SQLite的觸發器可以指定消防每當一個DELETE,INSERT或UPDATE一個特定的數據庫表時或在一個或多個指定表的列發生更新。
-
這時,SQLite支持FOR EACH ROW觸發,冇有FOR EACH STATEMENT觸發器。因此,明確指定FOR EACH ROW是可選的。
-
WHEN子句和觸發器動作可能訪問的行元素被插入,刪除或更新使用的形式NEW.column名稱OLD.column-name,其中列名是從表中的列名的引用該觸發器相關聯的。
-
如果提供WHEN子句指定的SQL語句隻執行的行的WHEN子句為真。如果冇有提供WHEN子句,SQL語句執行的所有行。
-
決定何時觸發動作將被執行插入,修改或刪除相關的行之前或之後的關鍵字。
-
觸發器表,它們丟棄時自動刪除。
-
要修改的表必須存在,在同一數據庫中的表或視圖,觸發器被附加,必須使用表名不database.tablename。
-
一個特殊的SQL函數RAISE() 可用於觸發器程序內引發異常。
語法
創建觸發器的基本語法如下:
CREATE TRIGGER trigger_name [BEFORE|AFTER] event_name ON table_name BEGIN -- Trigger logic goes here.... END;
在這裡,event_name 可能是INSERT,DELETE和UPDATE操作所提到的表table_name數據庫。您可以選擇指定FOR EACH ROW表名後。
以下是語法上創建一個觸發器UPDATE操作一個或多個指定一個表列如下:
CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name ON table_name BEGIN -- Trigger logic goes here.... END;
例子
讓我們考慮一個情況下,我們要保持審核COMPANY表中的每一條記錄被插入我們新創建如下(如果已經擁有它,刪除COMPANY表)試用:
sqlite> CREATE TABLE COMPANY( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL );
為了保持審計的試驗,我們將創建一個新的表被AUDIT將被插入日誌消息每當有一個新的記錄項表COMPANY:
sqlite> CREATE TABLE AUDIT( EMP_ID INT NOT NULL, ENTRY_DATE TEXT NOT NULL );
在這裡,ID是的審計記錄ID,EMP_ID的ID將來自COMPANY表和日期將保持COMPANY表時的記錄將被創建時間戳。所以,現在讓我們創建一個觸發器,COMPANY表如下:
sqlite> CREATE TRIGGER audit_log AFTER INSERT ON COMPANY BEGIN INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, datetime('now')); END;
現在,我們將開始實際工作中,讓我們開始COMPANY表中插入記錄,這將導致在AUDIT表中創建審計日誌記錄。因此,讓我們創建一個COMPANY表記錄如下:
sqlite> INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, 'Paul', 32, 'California', 20000.00 );
This will create one record in COMPANY table, which is as follows:
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 1 Paul 32 California 20000.0
同時,將創造一個記錄AUDIT表中。這個紀錄是觸發的結果,這是我們對COMPANY表上創建INSERT操作。類似的方式,可以創建觸發器,UPDATE和DELETE操作根據要求。
EMP_ID ENTRY_DATE ---------- ------------------- 1 2013-04-05 06:26:00
列出TRIGGERS
可以列出所有觸發器從SQLITE_MASTER表如下:
sqlite> SELECT name FROM sqlite_master WHERE type = 'trigger';
以上SQLite的語句會列出隻有一個條目如下:
name ---------- audit_log
如果要列出特定表上的觸發器,然後使用AND子句及表名如下:
sqlite> SELECT name FROM sqlite_master WHERE type = 'trigger' AND tbl_name = 'COMPANY';
以上SQLite語句也會列出隻有一個條目如下:
name ---------- audit_log
刪除 TRIGGERS
以下是DROP命令,它可以用來刪除一個現有的觸發器:
sqlite> DROP TRIGGER trigger_name;