觸發器(trigger)是一種特殊的儲存過程,它與表緊密相連,可以是定義表的一部分。當預定義的事件(如使用者修改指定表或者檢視中的資料)發生時,觸發器將會自動執行。
觸發器基於乙個表建立,但是可以針對多個表進行操作。所以觸發器可以用來對錶實施複雜的完整性約束,當觸發器所儲存的資料改變時,觸發器被自動啟用,從而防止對資料進行不正確的修改。觸發器的有點如下所述。
(1)觸發器自動執行,在表的資料做了任何修改(比如手工輸入或者使用程式採集的操作)之後立即啟用。
(2)觸發器可以通過資料庫中的相關表進行層疊更改。這比直接把**寫在前台的做法更安全合理。
(3)觸發器可以強制限制,這些限制比用 check 約束所定義的更複雜。與 check 約束不同的是,觸發器可以引用其他表中的列。
因為觸發器是一種特殊的儲存過程,所以觸發器的建立和儲存過程的建立方式有很多相似之處,其基本語法如下。
create trigger trigger_name trigger_time trigger_eventon tb_name
for each row trigger_statement;
在 create trigger 語法中,各引數含義如下:
(1)trigger_name:要建立的觸發器名稱。
(2)tb_name:建立觸發器的表名,即在哪個表上建立觸發器。tb_name 必須引用永久性表。
(3)trigger_time:指定觸發器觸發的時機。以指明觸發程式是在啟用它的語句之前或之後觸發。可以指定 before 或 after。
(4)trigger_event:指明啟用觸發程式的語句的型別。trigger_event可以是下述值之一。
① insert:將新行插入表時觸發程式。例如通過 insert、load data和replace語句。
② update:更改某一行時啟用觸發程式。例如通過update語句。
③ delete:從表中刪除某一行時啟用觸發程式。例如通過delete和raplace語句。
(5)for each row:觸發器的執行間隔,通知觸發器每隔一行執行一次動作,而不是對整個表執行一次。
(6)trigger_statement:指定觸發器所執行的 sql 語句。可以使用 begin...end 作為開始和結束。
在觸發器的 sql 語句中,可以關聯表中的任何列,通過使用 old 和 new 列名來標識,如old.col_name\new.col_name。old.col_name 關聯現有行的一列在被更新或刪除前的值。new.col_name 關聯乙個新行的插入或更新現有的行的一列的值。
對於 insert 語句,只有new 是合法的。對於delete語句,只有old是合法的。對於update語句,new和old可以同時使用。
例子:在gradem資料庫中,當向student表新增一條學生資訊時,同時還需要更新class表中的classnumber列,通過建立乙個insert觸發器,在使用者每次向student表中新增新的學生資訊時便更新響應的班級人數。這個觸發器的名字為trig_classnum,其定義語句如下。
mysql>use gradem;mysql>create trigger trig_classnum
-> after insert on student for
each now
-> update class
set number=number+1
-> where classno = left(new.sno,8);
為確保找到學生的班號,利用left()函式取學生學號的前八位。這樣,在輸入學生資訊時,如果classno為空,也不會出現在student表中找不到的情況。
例:在gradem資料庫的teacher表中,定義乙個觸發器,當乙個教師的資訊被刪除時,把該教師的編號和姓名新增到delteacher表中。具體**如下。
mysql>use gradem;# 建立乙個空表 delteacher,表由tno和tname兩列組成。
mysql> create table delteacher select tno, tname from teacher where
1=0;
# 建立 teacher 表的觸發器
mysql>create trigger trig_teacher
-> after delete on teacher for
each row
-> insert into delteacher (tno,tname) values(old.tno, old.tname);
例:建立乙個觸發器,當student表中的學生學號發生變更時,同時更新sc表中的相應的學生學號資訊。
mysql>use gradem;mysql> delimiter &&mysql>create trigger trip_snoupdate
-> after update on student for
each row
->begin
-> if
new.sno !=old.sno then
-> update sc set sno = new.sno where sno=old.sno;
-> end if
; -> end &&query ok,
0afected
mysql> delimiter ;
檢視觸發器是指檢視資料庫中已經存在的觸發器的定義、狀態和語法資訊等。
(1)show trigers
show triggers;
(2)
select * from information_schema.triggers;
使用 drop trigger 語句可以刪除觸發器。
drop trigger [dbname.]trig_name;
結束!
資料庫之觸發器
觸發器 看到這個名字總是會想到數電中學過的觸發器,有輸入端和輸出端,根據電平的高低來觸發。資料庫中的觸發器是個特殊的儲存過程,主要是通過事件進行觸發而被執行的,而儲存過程可以通過儲存過程名稱而被直接呼叫。作用 使用t sql語句進行複雜的邏輯處理,基於乙個表建立,但是可以對多個表進行操作,因此常常用...
資料庫之觸發器
觸發器 看到這個名字總是會想到數電中學過的觸發器,有輸入端和輸出端,根據電平的高低來觸發。資料庫中的觸發器是個特殊的儲存過程,主要是通過事件進行觸發而被執行的,而儲存過程可以通過儲存過程名稱而被直接呼叫。作用 使用t sql語句進行複雜的邏輯處理,基於乙個表建立,但是可以對多個表進行操作,因此常常用...
資料庫之觸發器
1.概述 觸發器是特殊的儲存過程。儲存過程是由使用者主動去呼叫執行,觸發器是資料庫在發生一些事件的時候主動呼叫。常見的觸發器 sql server 有instead of 和 after for 資料庫為觸發器特別的建立兩張表 inserted表 deleted表 這兩張表由資料庫維護,存在記憶體中...