前言:上面一片文章整理了觸發器的基礎知識點,下面我們看看如何使用觸發器以及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
當删除一行時被觸發。
上面是一些觸發器的操作整理,希望對你有幫助!