天天看點

【SQL SERVER】觸發器(二)

前言:上面一片文章整理了觸發器的基礎知識點,下面我們看看如何使用觸發器以及insert和delete表;

這裡我們補充一下觸發器的缺點:

  性能較低。我們在運作觸發器時,系統處理的大部分時間花費在參照其它表的處理上,這些表既不在記憶體中也不在資料庫裝置上,而删除表delete和插入表insert總是位于記憶體中。

  具有隐藏性,增加了系統的複雜性,一般情況下了解起來會有困難,因為它不執行我們根本感覺不到。

觸發器是一種特殊的存儲過程,很多人認為觸發器能實作的存儲過程也能實作,而且觸發器在性能上也沒有很大的提升,建議不要用觸發器,其實大家在處理業務的時候各有各的想法和解決問題的辦法。下面我們看一下兩個特殊的邏輯表:

一、Insert表和Delete表

  在執行觸發器時,系統建立兩個特殊的邏輯表,Insert和Delete表,這兩個表是由系統管理和維護的,存儲在記憶體中,而不是存儲在資料庫中,是以我們沒辦法對其修改。這兩個表是和被觸發器作用的表具有相同的表結構,而且是動态駐留在記憶體中,一旦觸發器執行完畢,那麼這兩個表随之被删除。總的來說,這兩個表主要儲存因使用者操作而被影響到的原資料值和新資料值。

  1、Insert表:存放由于執行Insert或Update語句要從表插入的所有行,當執行Insert或Update語句時,新的行同時被添加到觸發器的表中和Insert表中。

  2、Delete表:存放由于執行Delete或Update語句要從表中删除的所有行。當執行Delete或Update語句時,被删除的行會從被激活的觸發器中移動到Delete表中。

  被Update語句觸發的觸發器會建立Insert表和Delete表。

二、使用觸發器

先在資料庫建立一個表

CREATE TABLE [employee](
    [emp_id] [empid] NOT NULL,
    [fname] [varchar](20) NOT NULL,
    [minit] [char](1) NULL,
    [lname] [varchar](30) NOT NULL,
    [job_id] [smallint] NOT NULL,
    [job_lvl] [tinyint] NULL,
    [pub_id] [char](4) NOT NULL,
    [hire_date] [datetime] NOT NULL
)       

1、對表employee建立觸發器

create Trigger unemployee on employee
For Update
AS
raiserror ('update has been done successfully',16,10);

update employee set fname='smith' where emp_id='PMA42628M';      

執行後得到以下效果

消息 50000,級别 16,狀态 10,過程 unemployee,第 4 行
update has been done successfully

(1 行受影響)      

例2、當對定義了删除型觸發器的employee表進行删除操作時,首先檢查删除幾行,如果删除多行則傳回提示資訊,并復原。

create trigger Delete_employee 
on employee for delete
IF (@@rowcount=0) return
IF (@@rowcount>1)
begin
rollback transaction
raiserror('一下隻能删除一條資料',16,1)
end
return      

當删除一行時被觸發。

上面是一些觸發器的操作整理,希望對你有幫助!