在前面的文章中,我們曾經介紹過觸發器的作用,但那篇文章內容過于簡單,可能大家還是不明白觸發器到底是什么,其作用到底是什么,本文將較為詳細地介紹一下SQL Server中觸發器的相關知識。
首先,我們介紹一下什么是觸發器:
觸發器(trigger)是種特殊的存儲過程,它的執行不是由程序調用,也不需要手動操作,它是由事件來觸發,即當我們對個某個表執行增刪改操作時所觸發的。當對一個數據庫或表進行增刪改( Insert,Delete,Update)的時就會激活觸發器。
從SQL2005開始,根據SQL語句的不同將觸發器分成了兩類,一類是DML觸發器,一類是DLL觸發器。其中DML觸發器又分為兩類:After觸發器和Instead Of觸發器。
其次,我們說一下SQL Server中觸發器的種類:
SQL Server中的觸發器,可以分為DML觸發器和DDL觸發器。
(1)DML(Data Manipulation Language)觸發器是當數據庫服務器中發生數據操作語言事件時執行的存儲過程。DML觸發器又分為兩類:After觸發器和Instead Of觸發器
1)After觸發器:從其名字中,我們可以知道這類觸發器是在記錄已經改變完之后(after),才會被激活執行,它主要是用于記錄變更后的處理或檢查,一旦發現錯誤,也可以用Rollback Transaction語句來回滾本次的操作。
2)Instead Of觸發器:這類觸發器一般是用來取代原本的操作,在記錄變更之前發生的,它并不去執行原來SQL語句里的操作(Insert、Update、Delete),而去執行觸發器本身所定義的操作。
(2)DDL觸發器(Data Definition Language):DDL觸發器是在響應數據定義語言事件時執行的存儲過程。DDL觸發器一般用于執行數據庫中管理任務。如審核和規范數據庫操作、防止數據庫表結構被修改等。
然后,我們再說一下觸發器相關的兩個系統表Inserted表和Deleted表
在SQL Server里,每個DML觸發器都分配有兩個特殊的表,一個是Inserted表,一個是Deleted表。它們兩個存在于數據庫服務器的內存中,是由系統管理的邏輯表,是兩個臨時表,而不是真正存儲在數據庫中的物理表。用戶對這兩個表只有讀取的權限,沒有修改的權限。
這兩個表的結構(主外鍵、字段、數據類型等)與觸發器所在數據表的結構是完全一致的,當觸發器的工作完成之后,這兩個表也將會從內存中刪除。
(1)Inserted表:對于插入記錄操作來說,插入表里存放的是要插入的數據;對于更新記錄操作來說,插入表里存放的是要更新的記錄。
(2)Deleted表:對于更新記錄操作來說,刪除表里存放的是被更新記錄;對于刪除記錄操作來說,刪除表里存入的是被刪除的舊記錄。
最后,我們再說一下After觸發器和Instead of觸發器的的工作原理:
(1)After觸發器的工作原理:
After觸發器是在SQL語句執行之后才被激活的。以刪除記錄為例:當SQL Server接收到一條刪除操作的SQL語句時,SQL Server先將要刪除的記錄存放在Deleted表里,然后把數據表里的記錄刪除,再激活After觸發器,執行After觸發器里的SQL語句。執行完畢之后, 刪除內存中的Deleted表,操作結束。
如:在學生選課表中刪除學生的某個選課記錄時,觸發器可以更新學生表中的選課門數,將選課門數自動減1。其執行過程如下:
1)刪除時,觸發該觸發器,將要刪除的選課記錄放在刪除表Deleted表里;
2)從選課表中刪除該選課記錄;
3)從刪除表Deleted中讀出該選課記錄的學號,根據學號更新學生表中的選課記錄。
(2)Instead Of 觸發器的工作原理:
Instead Of觸發器與After觸發器不同。After觸發器是在Insert、Update和Delete操作完成后才激活的,而Instead Of觸發器,是在這些操作進行之前就激活了,并且不再去執行原來的SQL操作,而是用觸發器本身的SQL語句代替原來的語句去執行。
如,我們要刪除學生表中的某條記錄,可能該學生有選課記錄,為了避免造成選課表中產生冗余的記錄,我們需要首先檢查該學生是否有選課記錄,如有選課記錄,則首先刪除該學生的選課記錄,然后再刪除該生信息,則可以使用Instead O觸發器來實現。當然,你可能會問,為什么不使用After觸發器來進行了,如果學生表和選課表之間沒有建立關聯關系的話,可以使用After觸發器來執行操作,但是,如果兩個表之間建立了關聯關系,使用After觸發器是不行的,原因是SQL server不允許刪除一個具有被參照關系表中的記錄。所以使用Instead Of觸發器進行。其原理流程如下:
1)當觸發器被觸發時,刪除操作先不進行,而是執行Instead Of中的SQL語句;
2)根據傳入的學生學號,將選課記錄中,所有該生的選課信息刪除;
3)然后再刪除該學生的信息。
好了,到此,關于觸發器的基本知識講完,下面推薦本站中的其它關于觸發器知識的兩篇文章:
Oracle觸發器主鍵自動增長
Delphi”程序級觸發器”功能的實現
新聞熱點
疑難解答