觸發器(trigger)是SQL server 提供給程序員和數據分析員來保證數據完整性的一種方法,是一種特殊類型的存儲過程,它是與表事件相關的特殊的存儲過程,它的執行不是由程序調用,也不是手工啟動,而是由事件來觸發,比如當對一個表進行操作( insert,delete, update)時就會激活它執行。觸發器經常用于加強數據的完整性約束和業務規則等。 觸發器可以從 DBA_TRIGGERS ,USER_TRIGGERS 數據字典中查到。SQL3的觸發器是一個能由系統自動執行對數據庫修改的語句。
觸發器與存儲過程的唯一區別是觸發器不能執行EXECUTE語句調用,而是在用戶執行Transact-SQL語句時自動觸發執行。
在Oracle中,觸發器是一種特殊的存儲過程,它在發生某種數據庫事件時由Oracle系統自動觸發發器,通常用于加強數據的完整性約束和業務規則等。
什么是觸發器---觸發器的功能
① 完成比約束更復雜的數據約束:觸發器可以實現比約束更為復雜的數據約束
② 檢查所做的SQL是否允許:觸發器可以檢查SQL所做的操作是否被允許。例如:在產品庫存表里,如果要刪除一條產品記錄,在刪除記錄時,觸發器可以檢查該產品庫存數量是否為零,如果不為零則取消該刪除操作。
③ 修改其它數據表里的數據:當一個SQL語句對數據表進行操作的時候,觸發器可以根據該SQL語句的操作情況來對另一個數據表進行操作。例如:一個訂單取消的時候,那么觸發器可以自動修改產品庫存表,在訂購量的字段上減去被取消訂單的訂購數量。
④ 調用更多的存儲過程:約束的本身是不能調用存儲過程的,但是觸發器本身就是一種存儲過程,而存儲過程是可以嵌套使用的,所以觸發器也可以調用一個或多過存儲過程。
⑤ 發送SQL Mail:在SQL語句執行完之后,觸發器可以判斷更改過的記錄是否達到一定條件,如果達到這個條件的話,觸發器可以自動調用SQL Mail來發送郵件。例如:當一個訂單交費之后,可以物流人員發送Email,通知他盡快發貨。
⑥ 返回自定義的錯誤信息:約束是不能返回信息的,而觸發器可以。例如插入一條重復記錄時,可以返回一個具體的友好的錯誤信息給前臺應用程序。
⑦ 更改原本要操作的SQL語句:觸發器可以修改原本要操作的SQL語句,例如原本的SQL語句是要刪除數據表里的記錄,但該數據表里的記錄是最要記錄,不允許刪除的,那么觸發器可以不執行該語句。
⑧ 防止數據表構結更改或數據表被刪除:為了保護已經建好的數據表,觸發器可以在接收到Drop和Alter開頭的SQL語句里,不進行對數據表的操作。
什么是觸發器---觸發器的組成
1. 觸發事件:引起觸發器被觸發的事件。 例如:DML語句(INSERT, UPDATE, DELETE語句對表或視圖執行數據處理操作)、DDL語句(如CREATE、ALTER、DROP語句在數據庫中創建、修改、刪除模式對象)、數據庫系統事件(如系統啟動或退出、異常錯誤)、用戶事件(如登錄或退出數據庫)。
2. 觸發時間:即該TRIGGER是在觸發事件發生之前(BEFORE)還是之后(AFTER)觸發,也就是觸發事件和該TRIGGER的操作順序。
3. 觸發操作:即該TRIGGER 被觸發之后的目的和意圖,正是觸發器本身要做的事情。 例如:PL/SQL塊。
4. 觸發對象:包括表、視圖、模式、數據庫。只有在這些對象上發生了符合觸發條件的觸發事件,才會執行觸發操作。
5. 觸發條件:由WHEN子句指定一個邏輯表達式。只有當該表達式的值為TRUE時,遇到觸發事件才會自動執行觸發器,使其執行觸發操作。
6. 觸發頻率:說明觸發器內定義的動作被執行的次數。即語句級(STATEMENT)觸發器和行級(ROW)觸發器。
什么觸發器---觸發器的基本特性
觸發器有三個基本特性:
(1)有兩個穩態,可分別表示二進制數碼0和1,無外觸發時可維持穩態;
(2)外觸發下,兩個穩態可相互轉換(稱翻轉),已轉換的穩定狀態可長期保持下來,這就使得觸發器能夠記憶二進制信息,常用作二進制存儲單元。
? ? ? ??
由于觸發器有兩個穩定狀態,它就有一定的記憶功能,使用一個觸發器可以記憶外部事件的兩種狀態,如果需要記憶更多的狀態,就要通過多個觸發器的連接來實現。由于一位二進制數也只有0和1兩個狀態,所以,一個觸發器可以記憶一位二進制數,N個觸發器,可以記憶N位二進制數。
什么是觸發器---觸發器的基本特點
(1)具有兩個互補輸出端Q和/Q;
(2)具有“0”態和“1”態兩個穩定狀態;
(3)在外部信號作用下可實現狀態轉換,即翻轉;
(4)外部信號消失時具有記憶功能,這就使得觸發器能夠記憶二進制信息。
觸發器邏輯功能的表示方法有:
(1)狀態表或功能表:狀態表中包括輸入激勵信號取值,觸發器的原始狀態(亦稱初態)取值和翻轉后的狀態(亦稱次態)的取值。而功能表則只列出輸入激勵信號取值和觸發器次態取值,比較簡潔。
(2)狀態方程:由狀態表歸納而列寫出的邏輯方程。
(3)狀態轉換圖。
(4)波形圖(又稱時序圖):畫出對應輸入狀態波形的輸出狀態波形。
鎖存器和觸發器的區別
鎖存器和觸發器是具有記憶功能的二進制存貯器件,是組成各種時序邏輯電路的基本器件之一。區別為:latch同其所有的輸入信號相關,當輸入信號變化時latch就變化,沒有時鐘端;flip-flop受時鐘控制,只有在時鐘觸發時才采樣當前的輸入,產生輸出。當然因為latch和flip-flop二者都是時序邏輯,所以輸出不但同當前的輸入相關還同上一時間的輸出相關。
1、latch由電平觸發,非同步控制。在使能信號有效時latch相當于通路,在使能信號無效時latch保持輸出狀態。DFF由時鐘沿觸發,同步控制。
2、latch對輸入電平敏感,受布線延遲影響較大,很難保證輸出沒有毛刺產生;DFF則不易產生毛刺。
3、如果使用門電路來搭建latch和DFF,則latch消耗的門資源比DFF要少,這是latch比DFF優越的地方。所以,在ASIC中使用 latch的集成度比DFF高,但在FPGA中正好相反,因為FPGA中沒有標準的latch單元,但有DFF單元,一個LATCH需要多個LE才能實現。latch是電平觸發,相當于有一個使能端,且在激活之后(在使能電平的時候)相當于導線了,隨輸出而變化。在非使能狀態下是保持原來的信號,這就可以看出和flip-flop的差別,其實很多時候latch是不能代替ff的。 4、latch將靜態時序分析變得極為復雜。
5、目前latch只在極高端電的路中使用,如intel 的P4等CPU。 FPGA中有latch單元,寄存器單元就可以配置成latch單元,在xilinx v2p的手冊將該單元成為register/latch單元,附件是xilinx半個slice的結構圖。
一般的設計規則是:在絕大多數設計中避免產生latch。它會讓您設計的時序完蛋,并且它的隱蔽性很強,非老手不能查出。latch最大的危害在于不能過濾毛刺。這對于下一級電路是極其危險的。所以,只要能用D觸發器的地方,就不用latch。
有些地方沒有時鐘,也只能用latch了。比如現在用一個clk接到latch的使能端(假設是高電平使能),這樣需要的setup時間,就是數據在時鐘的下降沿之前需要的時間,但是如果是一個DFF,那么setup時間就是在時鐘的上升沿需要的時間。這就說明如果數據晚于控制信號的情況下,只能用latch,這種情況就是,前面所提到的latch timing borrow。基本上相當于借了一個高電平時間。也就是說,latch借的時間也是有限的。
對latch進行STA的分析其實也是可以,但是要對工具相當熟悉才行。不過很容易出錯。當前PrimeTime,是支持進行latch分析的。現在一些綜合工具內置的STA分析功能也支持,比如RTL compiler, Design Compiler.除了ASIC里可以節省資源以外。latch在同步設計里出現的可能還是挺小的,現在處理過程中大都放在ff里打一下。
觸發器的觸發方式
觸發方式是研究觸發器翻轉時刻與時鐘脈沖間的關系,在各類觸發器中,存在三種觸發方式:電平觸發方式、主從觸發方式、邊沿觸發方式。
1、電平觸發方式
電平觸發方式分為二種:高電平觸發方式(在時鐘脈沖C=1期間翻轉);低電平觸發方式(在時鐘脈沖C=0期間翻轉)。
電平觸發方式結構簡單、觸發速度快。在時鐘信號有效電平期間(C=1或C=0),觸發器總是處于可翻轉狀態,輸入信號的變化都會引起觸發器狀態的變化。在時鐘信號無效電平期間,觸發器狀態保持不變。因此,在時鐘信號有效電平寬度較寬時,觸發器會連續不停地翻轉。如果要求每來一個C脈沖觸發器僅翻轉一次的話,則對時鐘脈沖的有效電平的寬度要求極為苛刻,所以實際中應用并不廣泛。
2、主從觸發方式
主從型JK觸發器、由主從型JK觸發器轉換的各種功能的觸發器都屬于這種觸發方式。這種觸發方式的工作特點是:克服了在C有效電平期間多次翻轉現象,具有一次翻轉特性。就是說,在C有效電平期間,主觸發器接受了輸入信號發生一次翻轉后,主觸發器狀態就一直保持不變,也不再隨輸入信號J。K的變化而變化。一次翻轉特性有利有弊:利在于克服了空翻現象;弊是帶來了抗干擾能力差的問題。
3、邊沿觸發方式
為了免除C=1期間輸入信號不許擾動的限制,可采用邊沿觸發方式。其特點是:觸發器只在時鐘跳轉時刻發生翻轉,而在C=1或C=0期間,輸入端的任何變化都不影響輸出。比如前面介紹過的維持阻塞型的D觸發器。除此以外,當然也有邊沿觸發的JK觸發器。
如果翻轉發生在上升沿就叫“前邊沿觸發或正邊沿觸發”。如果翻轉發生在下降沿就叫“后邊沿觸發”或“負邊沿觸發”。
評論
查看更多