精品熟女碰碰人人a久久,多姿,欧美欧美a v日韩中文字幕,日本福利片秋霞国产午夜,欧美成人禁片在线观看

SQLite 觸發(fā)器

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-nameold.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;

下一節(jié):sqlite 索引

sqlite教程

相關(guān)文章