SQL觸發器(AFTER和INSTEAD OF)


轉自:http://www.cnblogs.com/shepherldeng/archive/2010/06/23/1763766.html

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

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

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也會一起改變了…

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM