SQL觸發器

iSQlServer發表於2010-06-25
最近沒太多事做,今天就拿著本書看了看觸發器,以前一直在專案中很少用,所以就從頭好好學學,以下是學習的成果。

何為觸發器:觸發器是資料庫伺服器中發生事件時自動執行的特種儲存過程,這是幫助文件上的定義,就認為是一種特殊的儲存過程也行,經常用於強制執行業務規則和資料完整性。

在正式操作之前先把觸發器原理給說說,理解好觸發器的機制是對更好的運用觸發器自己好處很明顯。

1、原理:

  在執行觸發器的過程中會產生兩張臨時表INSERTED 和DELETED,這兩張表的作用簡單說就是拿來記錄資料的,主我們可以在觸發器執行過程中更好的對資料進行操作

  對錶執行INSERT和UPDATE操作時都會在臨時表INSERTED中拷貝一份所增加的資料。

  對錶執行DELETE和UPDATE操作時都會在臨時表DELETED中拷貝一份所刪除的資料

    對錶執行UPDATE操作時,首先把UPDATE前的資料DELETE到DELETED臨時表中,然後再把所要更新的資料插入表中,最後把更新後的資料拷貝到INSERTED臨時表中

 

觸發器分為兩種AFTER和INSTEAD OF

2、AFTER

  字面意思就是在對錶執行INSERT、UPDATE、DELETE操作後觸發的觸發器了,這裡以INSERT結合觸發器原理簡單描述其過程

  當有INSERT語句要執行時,首先直接執行INSERT語句,再就是AFTER執行觸發器裡面的操作(把資料拷貝到臨時表INSERTED中,然後進行我們想要的操作,最後完成同樣刪除了臨時                    表)

  下面就開始進行例項演示了:

01 --學生
02 create table Student
03 (
04     StudentNo int primary key,  
05     StudentName varchar(20) not null
06 )
07 --書本
08 create table Book
09 (
10     BookId int identity(1,1),
11     BookName varchar(30),
12     Owner int foreign key references Student(StudentNo)
13 )
14 insert into Student values(1,'ShepherlDeng')
15 insert into Student values(2,'Divi')
16 insert into Student values(3,'Lili')
17 insert into Book values('Book--01',1)
18 insert into Book values('Book--02',2)
19 insert into Book values('Book--01',3)
20 insert into Book values('Book--02',1)
21 insert into Book values('Book--03',2)
22 insert into Book values('Book--03',3)
23 insert into Book values('Book--04',1)
24 insert into Book values('Book--04',2)
25 insert into Book values('Book--01',3)

 如果我們有這樣一個業務需求,就是當有一個學生時,必須買Book--01這一本書

於是我們可以寫個簡單的AFTER觸發器

1 CREATE TRIGGER itStudent
2 on Student
3 after Insert
4 as
5 begin
6 declare @studentNo int
7 select @studentNo=StudentNo from Inserted
8 insert into Book values('Book--01',@studentNo)
9 end

  當我們增加一條記錄時就會自動在Book表中增加一條記錄,這裡其它操作也很相像所以不多說了只要知道是在操作守後再執行,重點放在INSTEAD OF觸發器上。

 

3、INSTEAD OF

  字面意思為取代,難道說當在一張表上定義了這樣的觸發器後,對錶所做的INSERT、UPDATE、DELETE操作會被替換掉而不執行了?呵呵…這種觸發器執行過程為:

  當對錶執行INSERT等操作時,並不直接執行這些操作而是轉到觸發器裡面來執行觸發器所定義的操作語句(應該說是一起執行的更合適);

 

  演示仍然為上面的所建立的表首先我們演示一個級聯刪除,當我們在Student表中刪除一個被Book引用記錄時因為有完整無缺約束我們無法刪除這是INSTEAD OF就有作用了  

1 CREATE TRIGGER dtStudent
2 on Student
3 instead of Delete
4 as
5 begin
6 declare @studentNo int
7 select @studentNo=StudentNo from Deleted
8 delete Book where Owner=@studentNo
9 end

 呵呵這是不是很爽呢……

 

 那我們再來演示一個UPDATE的INSTEAD OF觸發器的操作

01 Create Trigger utStudent
02 on Student 
03 instead of Update
04 as
05 begin
06 declare @studentNo int,
07             @studentNold int
08     if update(StudentNo)
09     begin
10     select @studentNold=StudentNo from Deleted
11     select @studentNo=StudentNo from Inserted
12     update Book set Owner=@studentNo where Owner=@studentNold
13     end
14 end

這會是什麼結果呢?執行後就會發現當你更改StudentNo是它的子表Book中的Owner也會一起改變了…

我還是覺得觸發器能解決的好像儲存過程也可以,以前也用儲存過程寫級聯刪除感覺要比這個要繁瑣點,還有人說觸發器是高手用的,總之各有各的應用場景了看怎麼用了。

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

相關文章