觸發(fā)器:能夠存儲(chǔ)一個(gè)“0”或“1”的基本存儲(chǔ)單元電路。
結(jié)構(gòu)示意圖
基本性質(zhì):
1、具有兩個(gè)穩(wěn)定的狀態(tài),分別用二進(jìn)制數(shù)碼1和0表示。
2、由一個(gè)穩(wěn)態(tài)到另一個(gè)穩(wěn)態(tài),必須有外界信號(hào)的觸發(fā);否則,它將長(zhǎng)期穩(wěn)定在某個(gè)狀態(tài),即可以長(zhǎng)期保持所記憶的信息。
3、具有兩個(gè)輸出端,并且互反。如果外界信號(hào)使,則破壞了觸發(fā)器的狀態(tài),這種信號(hào)在實(shí)際使用時(shí)是不允許出現(xiàn)的。
分類:RS觸發(fā)器 JK觸發(fā)器 D觸發(fā)器 T觸發(fā)器等
觸發(fā)器及觸發(fā)器的作用
觸發(fā)器是一種用來(lái)保障參照完整性的特殊的存儲(chǔ)過(guò)程,它維護(hù)不同表中數(shù)據(jù)間關(guān)系的有關(guān)規(guī)則。當(dāng)對(duì)指定的表進(jìn)行某種特定操作(如:Insert,Delete或Update)時(shí),觸發(fā)器產(chǎn)生作用。觸發(fā)器可以調(diào)用存儲(chǔ)過(guò)程。
創(chuàng)建觸發(fā)器的語(yǔ)法:
Create Trigger[owner.]觸發(fā)器名
On [owner.]表名
For {insert,update,delete}
As
Begin
SQL語(yǔ)句(塊)
End
定義一個(gè)好的觸發(fā)器對(duì)簡(jiǎn)化數(shù)據(jù)的管理,保證數(shù)據(jù)庫(kù)的安全都有重要的影響。觸發(fā)器是針對(duì)表一級(jí)的,這就意味著,只有表的所有者有權(quán)創(chuàng)建表的觸發(fā)器。
舉例:
/* 插入一個(gè)新行,必須保證外鍵與主鍵相匹配,觸發(fā)器應(yīng)該首先檢查被插入行與主鍵表的連接。*/
#以下的觸發(fā)器對(duì)inserted表和titles表的title_id進(jìn)行比較,這里假設(shè)正在給外鍵輸入數(shù)據(jù),沒(méi)有插入空值,若連接失敗,事務(wù)被回退。insert,update,delete
Create trigger forinsertrigl
For insert
As
If(select count(*)
From title,inserted
Where titles.title_id=inserted.title_id)!=@@rowcount
Begin
Rollback transaction
Print “No,some title_id does not exist in titles.”
End
Else
Print “Added! All the title_id is exist in titles.”
/*
在本例中,@@rowcount代表添加到salesdetail表的行數(shù),這也是添加到inserted表中的行數(shù)。通過(guò)連接表titles和表inserted來(lái)檢測(cè)所有添加到salesdetail的title_id是否在titles中存在。若所連接的行數(shù)(count(*))與@@rowcount不同,由有一個(gè)或多個(gè)插入不正確,整個(gè)事務(wù)被取消。*/
觸發(fā)器的限制:
●一個(gè)表最多只能有三個(gè)觸發(fā)器,insert,update,delete
●每個(gè)觸發(fā)器只能用于一個(gè)表
●不能對(duì)視圖、臨時(shí)表創(chuàng)建觸發(fā)器
●Truncate table能刪除表,但不能觸發(fā)觸發(fā)器
●不能將觸發(fā)器用于系統(tǒng)表
合理地使用觸發(fā)器對(duì)性能的影響是正面的。在設(shè)計(jì)和使用觸發(fā)器時(shí),經(jīng)常地用sp_depends命令了解對(duì)象所關(guān)聯(lián)的觸發(fā)器是有好處的,該命令能列出觸發(fā)器影響的所有對(duì)象、表和視等。
在定義幾類數(shù)據(jù)庫(kù)對(duì)象的時(shí)候,對(duì)存儲(chǔ)過(guò)程、索引和觸發(fā)器要給予特別的注意,尤其存儲(chǔ)過(guò)程,它設(shè)計(jì)的好壞對(duì)數(shù)據(jù)庫(kù)性能的影響很大。
說(shuō)明:Sybase觸發(fā)器使用的兩個(gè)測(cè)試表:Deleted表和Inserted表,它們都是臨時(shí)表,其結(jié)構(gòu)與觸發(fā)器的基表結(jié)構(gòu)相同,用來(lái)存放與修改相關(guān)的數(shù)據(jù)行。
常見(jiàn)的觸發(fā)器有三種:分別應(yīng)用于Insert,Update,Delete事件。
使用觸發(fā)器的優(yōu)點(diǎn)
觸發(fā)器是自動(dòng)的:它們?cè)趯?duì)表的數(shù)據(jù)作了任何修改(比如手工輸入或者應(yīng)用程序采取的操作)之后立即被激活。
觸發(fā)器可以通過(guò)數(shù)據(jù)庫(kù)中的相關(guān)表進(jìn)行層疊更改。例如,可以在 titles 表的 title_id 列上寫入一個(gè)刪除觸發(fā)器,以使其它表中的各匹配行采取刪除操作。該觸發(fā)器用 title_id 列作為唯一鍵,在 titleauthor、sales 及 roysched 表中對(duì)各匹配行進(jìn)行定位。
觸發(fā)器可以強(qiáng)制限制,這些限制比用 CHECK 約束所定義的更復(fù)雜。與 CHECK 約束不同的是,觸發(fā)器可以引用其它表中的列。例如,觸發(fā)器可以回滾試圖對(duì)價(jià)格低于 10 美元的書(shū)(存儲(chǔ)在 titles 表中)應(yīng)用折扣?!?p《 /》
數(shù)據(jù)庫(kù)中的觸發(fā)器是用來(lái)做什么的?
觸發(fā)器是一種特殊類型的存儲(chǔ)過(guò)程,當(dāng)使用下面的一種或多種數(shù)據(jù)修改操作在指定表中對(duì)數(shù)據(jù)進(jìn)行修改時(shí),觸發(fā)器會(huì)生效:UPDATE、INSERT 或 DELETE。觸發(fā)器可以查詢其它表,而且可以包含復(fù)雜的 SQL 語(yǔ)句。它們主要用于強(qiáng)制復(fù)雜的業(yè)務(wù)規(guī)則或要求。例如,可以控制是否允許基于顧客的當(dāng)前帳戶狀態(tài)插入定單。
觸發(fā)器還有助于強(qiáng)制引用完整性,以便在添加、更新或刪除表中的行時(shí)保留表之間已定義的關(guān)系。然而,強(qiáng)制引用完整性的最好方法是在相關(guān)表中定義主鍵和外鍵約束。如果使用數(shù)據(jù)庫(kù)關(guān)系圖,則可以在表之間創(chuàng)建關(guān)系以自動(dòng)創(chuàng)建外鍵約束。有關(guān)詳細(xì)信息,請(qǐng)參見(jiàn)表關(guān)系。
使用觸發(fā)器的優(yōu)點(diǎn)
觸發(fā)器的優(yōu)點(diǎn)如下:
觸發(fā)器是自動(dòng)的:它們?cè)趯?duì)表的數(shù)據(jù)作了任何修改(比如手工輸入或者應(yīng)用程序采取的操作)之后立即被激活。
觸發(fā)器可以通過(guò)數(shù)據(jù)庫(kù)中的相關(guān)表進(jìn)行層疊更改。例如,可以在 titles 表的 title_id 列上寫入一個(gè)刪除觸發(fā)器,以使其它表中的各匹配行采取刪除操作。該觸發(fā)器用 title_id 列作為唯一鍵,在 titleauthor、sales 及 roysched 表中對(duì)各匹配行進(jìn)行定位。
觸發(fā)器可以強(qiáng)制限制,這些限制比用 CHECK 約束所定義的更復(fù)雜。與 CHECK 約束不同的是,觸發(fā)器可以引用其它表中的列。例如,觸發(fā)器可以回滾試圖對(duì)價(jià)格低于 10 美元的書(shū)(存儲(chǔ)在 titles 表中)應(yīng)用折扣
評(píng)論