關於SQL SERVER觸發器的理解

iSQlServer發表於2010-01-07

觸發器是一種特殊的儲存過程,不是使用者直接呼叫,而是通過對錶的一些操作觸發的,比如對某個表的insert,update,delete,如果我們在該表中定義了相應的觸發器,那麼觸發器就會執行。

在SQL SERVER中,觸發器分為兩種,一是前觸發器(instead of),另一種是後觸發器(after or for).

它們的區別在於:

前觸發器(instead of) 顧名思意,就是代替引起觸發的操作,而去執行觸發器裡面定義的指令碼.

例如:

定義表:create talbe a(id int,name varchar(20),create table b(id int,name varchar(20).

定義觸發器:create trigger tri_a

                 on a  instead of insert

                 as

                 begin

                insert into b select * from inserted 

                end

當我們執行 insert into a (id,name) values (1,'abc) 的時候,該語句就觸發了定義在表的觸發器,從而執行insert into b

select * from inserted ,而不去執行插入表a的操作。其中inserted是個虛擬表,存放在記憶體中,下面會有詳細介紹。

後觸發器(after or for),是指對錶執行了insert,update,delete後,觸發定義在表的觸發器,執行觸發器的指令碼。

例如:

定義表:create table products(proid int identity(1,1),proname varchar(20),procount int ,unitprice decimal ,totalprice decimal )

定義觸發器:create trigger computeTotalprice

               on products for insert

               as

               begin

               update products

               set  totalprice = procount * unitprice

               where proname in (select proname form. inserted)

               end

當我們執行 insert into products (proname,procount,unitprice) values ('FOOD',10,4.5)後,就會觸發定義在products表的觸發器,該觸發器是計算該商品的總價。

 

在以上的觸發器的指令碼中都用到了虛擬表,inserted,但是還有另一虛擬表deleted,下面總結這兩個表的用途:

1.插入操作(Insert)

Inserted表有資料,Deleted表無資料

2.刪除操作(Delete)

Inserted表無資料,Deleted表有資料

3.更新操作(Update)

Inserted表有資料(新資料),Deleted表有資料(舊資料)

 

總結:雖然觸發器,本人在實踐中用得比較少,

但是個人認為,

前觸發器用在對某個表操作前,進行一些邏輯處理和判斷,從而判斷是否對該表進行相應的操作。

後觸發器用在對某個表操作後,進行操作自身和其他表。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-624600/,如需轉載,請註明出處,否則將追究法律責任。

相關文章