sqlite 觸發(fā)器
sqlite 觸發(fā)器(trigger)是數(shù)據(jù)庫的回調(diào)函數(shù),它會在指定的數(shù)據(jù)庫事件發(fā)生時自動執(zhí)行/調(diào)用。以下是關于 sqlite 的觸發(fā)器(trigger)的要點:
- sqlite 的觸發(fā)器(trigger)可以指定在特定的數(shù)據(jù)庫表發(fā)生 delete、insert 或 update 時觸發(fā),或在一個或多個指定表的列發(fā)生更新時觸發(fā)。
- sqlite 只支持 for each row 觸發(fā)器(trigger),沒有 for each statement 觸發(fā)器(trigger)。因此,明確指定 for each row 是可選的。
- when 子句和觸發(fā)器(trigger)動作可能訪問使用表單 new.column-name 和 old.column-name 的引用插入、刪除或更新的行元素,其中 column-name 是從與觸發(fā)器關聯(lián)的表的列的名稱。
- 如果提供 when 子句,則只針對 when 子句為真的指定行執(zhí)行 sql 語句。如果沒有提供 when 子句,則針對所有行執(zhí)行 sql 語句。
- before 或 after 關鍵字決定何時執(zhí)行觸發(fā)器動作,決定是在關聯(lián)行的插入、修改或刪除之前或者之后執(zhí)行觸發(fā)器動作。
- 當觸發(fā)器相關聯(lián)的表刪除時,自動刪除觸發(fā)器(trigger)。
- 要修改的表必須存在于同一數(shù)據(jù)庫中,作為觸發(fā)器被附加的表或視圖,且必須只使用 tablename,而不是 database.tablename。
- 一個特殊的 sql 函數(shù) raise() 可用于觸發(fā)器程序內(nèi)拋出異常。
1. 語法
創(chuàng)建 觸發(fā)器(trigger) 的基本語法如下:
create trigger trigger_name [before|after] event_name on table_name begin -- 觸發(fā)器邏輯.... end;
在這里,event_name 可以是在所提到的表 table_name 上的 insert、delete 和 update 數(shù)據(jù)庫操作。您可以在表名后選擇指定 for each row。
以下是在 update 操作上在表的一個或多個指定列上創(chuàng)建觸發(fā)器(trigger)的語法:
create trigger trigger_name [before|after] update of column_name on table_name begin -- 觸發(fā)器邏輯.... end;
讓我們假設一個情況,我們要為被插入到新創(chuàng)建的 company 表(如果已經(jīng)存在,則刪除重新創(chuàng)建)中的每一個記錄保持審計試驗:
sqlite> create table company( id int primary key not null, name text not null, age int not null, address char(50), salary real );
為了保持審計試驗,我們將創(chuàng)建一個名為 audit 的新表。每當 company 表中有一個新的記錄項時,日志消息將被插入其中:
sqlite> create table audit( emp_id int not null, entry_date text not null );
在這里,id 是 audit 記錄的 id,emp_id 是來自 company 表的 id,date 將保持 company 中記錄被創(chuàng)建時的時間戳。所以,現(xiàn)在讓我們在 company 表上創(chuàng)建一個觸發(fā)器,如下所示:
sqlite> create trigger audit_log after insert on company begin insert into audit(emp_id, entry_date) values (new.id, datetime('now')); end;
現(xiàn)在,我們將開始在 company 表中插入記錄,這將導致在 audit 表中創(chuàng)建一個審計日志記錄。因此,讓我們在 company 表中創(chuàng)建一個記錄,如下所示:
sqlite> insert into company (id,name,age,address,salary) values (1, 'paul', 32, 'california', 20000.00 );
這將在 company 表中創(chuàng)建如下一個記錄:
id name age address salary ---------- ---------- ---------- ---------- ---------- 1 paul 32 california 20000.0
同時,將在 audit 表中創(chuàng)建一個記錄。這個紀錄是觸發(fā)器的結果,這是我們在 company 表上的 insert 操作上創(chuàng)建的觸發(fā)器(trigger)。類似的,可以根據(jù)需要在 update 和 delete 操作上創(chuàng)建觸發(fā)器(trigger)。
emp_id entry_date ---------- ------------------- 1 2013-04-05 06:26:00
2. 列出觸發(fā)器(triggers)
您可以從 sqlite_master 表中列出所有觸發(fā)器,如下所示:
sqlite> select name from sqlite_master where type = 'trigger';
上面的 sqlite 語句只會列出一個條目,如下:
name ---------- audit_log
如果您想要列出特定表上的觸發(fā)器,則使用 and 子句連接表名,如下所示:
sqlite> select name from sqlite_master where type = 'trigger' and tbl_name = 'company';
上面的 sqlite 語句只會列出一個條目,如下:
name ---------- audit_log
3. 刪除觸發(fā)器(triggers)
下面是 drop 命令,可用于刪除已有的觸發(fā)器:
sqlite> drop trigger trigger_name;