何為觸發器:觸發器是數據庫服務器中發生事件時自動執行的特種存儲過程,這是幫助文檔上的定義,就認為是一種特殊的存儲過程也行,經常用於強制執行業務規則和數據完整性。
在正式操作之前先把觸發器原理給說說,理解好觸發器的機制是對更好的運用觸發器自己好處很明顯。
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中,然後進行我們想要的操作,最後完成同樣刪除了臨時 表)
下面就開始進行實例演示了:
--學生
create table Student
(
StudentNo int primary key,
StudentName varchar(20) not null
)
--書本
create table Book
(
BookId int identity(1,1),
BookName varchar(30),
Owner int foreign key references Student(StudentNo)
)
insert into Student values(1,'ShepherlDeng')
insert into Student values(2,'Divi')
insert into Student values(3,'Lili')
insert into Book values('Book--01',1)
insert into Book values('Book--02',2)
insert into Book values('Book--01',3)
insert into Book values('Book--02',1)
insert into Book values('Book--03',2)
insert into Book values('Book--03',3)
insert into Book values('Book--04',1)
insert into Book values('Book--04',2)
insert into Book values('Book--01',3)
--學生
create table Student
(
StudentNo int primary key,
StudentName varchar(20) not null
)
--書本
create table Book
(
BookId int identity(1,1),
BookName varchar(30),
Owner int foreign key references Student(StudentNo)
)
insert into Student values(1,'ShepherlDeng')
insert into Student values(2,'Divi')
insert into Student values(3,'Lili')
insert into Book values('Book--01',1)
insert into Book values('Book--02',2)
insert into Book values('Book--01',3)
insert into Book values('Book--02',1)
insert into Book values('Book--03',2)
insert into Book values('Book--03',3)
insert into Book values('Book--04',1)
insert into Book values('Book--04',2)
insert into Book values('Book--01',3)
如果我們有這樣一個業務需求,就是當有一個學生時,必須買Book--01這一本書
於是我們可以寫個簡單的AFTER觸發器
CREATE TRIGGER itStudent
on Student
after Insert
as
begin
declare @studentNo int
select @studentNo=StudentNo from Inserted
insert into Book values('Book--01',@studentNo)
end
當我們增加一條記錄時就會自動在Book表中增加一條記錄,這裡其它操作也很相像所以不多說了只要知道是在操作守後再執行,重點放在INSTEAD OF觸發器上。
3、INSTEAD OF
字面意思為取代,難道說當在一張表上定義了這樣的觸發器後,對表所做的INSERT、UPDATE、DELETE操作會被替換掉而不執行了?呵呵…這種觸發器執行過程為:
當對表執行INSERT等操作時,並不直接執行這些操作而是轉到觸發器裡面來執行觸發器所定義的操作語句(應該說是一起執行的更合適);
演示仍然為上面的所創建的表首先我們演示一個級聯刪除,當我們在Student表中刪除一個被Book引用記錄時因為有完整無缺約束我們無法刪除這是INSTEAD OF就有作用了
CREATE TRIGGER dtStudent
on Student
instead of Delete
as
begin
declare @studentNo int
select @studentNo=StudentNo from Deleted
delete Book where Owner=@studentNo
end
呵呵這是不是很爽呢……
那我們再來演示一個UPDATE的INSTEAD OF觸發器的操作
Create Trigger utStudent
on Student
instead of Update
as
begin
declare @studentNo int,
@studentNold int
if update(StudentNo)
begin
select @studentNold=StudentNo from Deleted
select @studentNo=StudentNo from Inserted
update Book set Owner=@studentNo where Owner=@studentNold
end
end
這會是什麼結果呢?執行後就會發現當你更改StudentNo是它的子表Book中的Owner也會一起改變了…
我還是覺得觸發器能解決的好像存儲過程也可以,以前也用存儲過程寫級聯刪除感覺要比這個要繁瑣點,還有人說觸發器是高手用的,總之各有各的應用場景了看怎麼用了。
關鍵詞:觸發器