資料庫原理之觸發器

2022-01-12 16:28:05 字數 2938 閱讀 5054

觸發器(trigger)是一種特殊的儲存過程,它與表緊密相連,可以是定義表的一部分。當預定義的事件(如使用者修改指定表或者檢視中的資料)發生時,觸發器將會自動執行。

觸發器基於乙個表建立,但是可以針對多個表進行操作。所以觸發器可以用來對錶實施複雜的完整性約束,當觸發器所儲存的資料改變時,觸發器被自動啟用,從而防止對資料進行不正確的修改。觸發器的有點如下所述。

(1)觸發器自動執行,在表的資料做了任何修改(比如手工輸入或者使用程式採集的操作)之後立即啟用。

(2)觸發器可以通過資料庫中的相關表進行層疊更改。這比直接把**寫在前台的做法更安全合理。

(3)觸發器可以強制限制,這些限制比用 check 約束所定義的更複雜。與 check 約束不同的是,觸發器可以引用其他表中的列。

因為觸發器是一種特殊的儲存過程,所以觸發器的建立和儲存過程的建立方式有很多相似之處,其基本語法如下。

create trigger trigger_name trigger_time trigger_event 

on 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表 這兩張表由資料庫維護,存在記憶體中...