SQL菜鳥入門級教程之觸發器

2021-08-26 22:42:56 字數 3612 閱讀 1676

本人水平有限,寫此部落格只為給那些像我一樣的菜鳥一點小小的幫助,還請各位大牛不要見笑。

資料庫的重要性就不用我多說了吧,我們做的大多數專案都要跟資料庫打交道。因此,熟練掌握資料庫的各種操作,就成了乙個程式設計師必備的技能。今天我們就來簡單說一下觸發器。

觸發器簡介:

觸發器(trigger)是種特殊的儲存過程,它的執行不是由程式呼叫,也不需要手動操作,它是由事件來觸發,事件大家應該非常熟悉吧,比如按鈕的click事件、網頁的load事件等。按鈕的click事件是通過滑鼠單擊按鈕觸發的,而觸發器的事件,是由對錶進行增刪改操作所觸發的。當對乙個資料庫或表

進行增刪改( insert,delete,update)的時就會啟用觸發器。

從sql2005開始,根據sql語句的不同將觸發器分成了兩類,一類是dml觸發器,一類是dll觸發器。其中dml觸發器又分為兩類:after觸發器和instead of觸發器。

觸發器的分類:

dml觸發器:dml

(data manipulation language)

觸發器是當資料庫伺服器中發生資料操作語言事件時執行的儲存過程。dml觸發器又分為兩類:after觸發器和instead of觸發器

ddl觸發器:ddl觸發器是在響應資料定義語言(data definition language)事件時執行的儲存過程。ddl觸發器一般用於執行資料庫中管理任務。如審核和規範資料庫操作、防止資料庫表結構被修改等。

dml觸發器:

今天我們我們主要介紹dml觸發器,dml觸發器分為after觸發器和instead of觸發器。

after觸發器:這類觸發器是在記錄已經改變完之後(after),才會被啟用執行,它主要是用於記錄變更後的處理或檢查,一旦發現錯誤,也可以用rollback transaction語句來回滾本次的操作。

instead of觸發器:這類觸發器一般是用來取代原本的操作,在記錄變更之前發生的,它並不去執行原來sql語句裡的操作(insert、update、delete),而去執行觸發器本身所定義的操作。

在sql server裡,每個dml觸發器都分配有兩個特殊的表,乙個是inserted表,乙個是deleted表。它們兩個存在於資料庫伺服器的記憶體中,是由系統管理的邏輯表,是兩個臨時表,而不是真正儲存在資料庫中的物理表。使用者對這兩個表只有讀取的許可權,沒有修改的許可權。

這兩個表的結構(主外來鍵、字段、資料型別等)與觸發器所在資料表的結構是完全一致的,當觸發器的工作完成之後,這兩個表也將會從記憶體中刪除。

inserted和deleted兩個表的作用:

inserted:對於插入記錄操作來說,插入表裡存放的是要插入的資料;對於更新記錄操作來說,插入表裡存放的是要更新的記錄。

deleted:對於更新記錄操作來說,刪除表裡存放的是被更新記錄;對於刪除記錄操作來說,刪除表裡存入的是被刪除的舊記錄。

看上面兩句話可能不太明白,那麼看看下面這張表是不是就明白了?

工作原理:

after觸發器的工作原理:

after觸發器是在sql語句執行之後才被啟用的。以刪除記錄為例:當sql server接收到一條刪除操作的sql語句時,sql server先將要刪除的記錄存放在deleted表裡,然後把資料表裡的記錄刪除,再啟用after觸發器,執行after觸發器裡的sql語句。執行完畢之後, 刪除記憶體中的deleted表,操作結束。

還是舉上面的例子:在產品庫存表裡,如果要刪除一條產品記錄,在刪除的時候,觸發器可以檢查該產品庫存數量是否為零,如果不為零則取消刪除操作。資料庫的操作如下:

1,接收sql語句,將要從產品庫存表裡刪除的產品記錄取出來,放在刪除表裡。

2,從產品庫存表裡刪除該產品記錄。

3,從刪除表裡讀出該產品的庫存數量字段,判斷是不是為零,如果為零的話,完成操作,從記憶體裡清除刪除表;如果不為零的話,用rollback transaction語句來回滾操作(即將庫存表還原成刪除之前的狀態)。

instead of 觸發器的工作原理:

instead of觸發器與after觸發器不同。after觸發器是在insert、update和delete操作完成後才啟用的,而instead of觸發器,是在這些操作進行之前就啟用了,並且不再去執行原來的sql操作,而是用觸發器本身的sql語句代替原來的語句去執行。

還拿上面那個例子來說,刪除一條產品記錄的時候,用instead of將刪除操作替換成查詢該產品的庫存。資料庫的操作如下:

1,接收sql語句,但不執行,而是跳轉到instead of後面的sql語句

2,根據傳入的產品id,將該產品的庫訪問出,完成操作。

說了那麼多理論上的東西,下面讓我們看看觸發器的**到底怎麼寫:

下面的一段**是觸發器的乙個框架。

create trigger  trigger_name --觸發器名,在乙個資料庫中觸發器名是唯一的。

on table_name | view_name --觸發器所在的表或者檢視。

after(for)|instead of insert,delete,update --定義成after或instead of型別的觸發器。

--after跟for相同,不可在檢視上定義after觸發器

-- 後面是觸發器被觸發的條件,最少有乙個,可以郵多個。如果有多個用逗號分開,順序無要求。

as --觸發器要執行的操作

begin

--begin跟end組成乙個**塊,可以寫也可以不寫,如果觸發器中執行的sql語句比較複雜,用begin和end會讓**更加整齊,更容易理解。

endgo --go就代表結操作完畢

注意事項:1,after觸發器只能用於資料表不能用於檢視;instead of觸發器兩者皆可,設定為with check option的檢視也不允許建立instead of觸發器。兩種觸發器都不可以建立在臨時表上。

2,乙個資料表可以有多個觸發器,但是乙個觸發器只能對應乙個表。

3,在同乙個資料表中,對每個操作(如insert、update、delete)而言可以建立許多個after觸發器,而instead of觸發器針對每個操作只有建立乙個。

4,如果針對某個操作即設定了after觸發器又設定了instead of觸發器,那麼instead of觸發器一定會啟用,而after觸發器就不一定會啟用。 5

,不同的sql語句,可以觸發同乙個觸發器,如insert和update語句都可以啟用同乙個觸發器。

6,觸發器名在所在的資料庫裡必須是唯一的。由於觸發器是建立中資料表或檢視中的,所以有很多人都以為只要是在不同的資料表中,觸發器的名稱就可以相同,其實觸發器的全名(server.database.owner.triggername)是必須 唯一的,這與觸發器在哪個資料表或檢視無關。

7,關鍵字after

可以用for來代取,它們的意思都是一樣的,代表只有在資料表的操作都已正確完成後才會啟用的觸發器。

關於觸發器就簡單介紹到這裡,有什麼不足還請各位不吝賜教!

游標,儲存過程,觸發器的入門級helloword

設表 book有欄位bookname bookid 游標declare book cur cursor for 定義乙個 select bookname from book where bookid 100001 使游標的值對應某一字段 open book cur 開啟 fetch next fro...

sql觸發器入門學習

先說一下sql中觸發器的概念 觸發器是一種特殊的儲存過程,被定義為在對特定表或檢視發出update insert delete?語句時自動執行 附 所謂事務是使用者定義的乙個資料庫操作序列,這些操作要麼全做要麼全不做,是乙個不可分割的工作單位。例如,在關聯式資料庫中,乙個事務可以是一條sql語句 一...

SQL2005 庫級觸發器的運用

版本號 2009 5 20 作 者 叮叮貓 起作用 只針對對資料的內錶的增加 刪除修改 但是當你對資料庫內資料的操作 是不能進行捕獲的 use testdb go use testdb gocreate table databaselog 建立一張表進行查詢 posttime datetime,da...