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