SQL SERVER触发器(附有实例)
觸發(fā)器:即當(dāng)發(fā)生某一事件時(shí),如果滿足給定條件,則執(zhí)行相應(yīng)的動(dòng)作。
它的基本架構(gòu):
??
?
觸發(fā)器創(chuàng)建語(yǔ)法:
(1)
CREATETRIGGER trigger_name
ON table|view
FOR|AFTER|INSTEADOF [DELETE][,INSERT][,UPDATE]
AS
Sql_statement[…n]
(2)
CREATETRIGGER trigger_name
ON table|view
FOR|AFTER|INSTEADOF [DELETE][,INSERT][,UPDATE]
AS
IFUPDATE(column)
[{AND|OR}UPDATE(COLUMN)][…]
IF(COLUMNS_UPDATED())
Sql_statement[…n]
注:(不同數(shù)據(jù)庫(kù)支持不同的類型觸發(fā)器,有些還支持before類型觸發(fā)器,像SQL server 就不支持before觸發(fā)器)
?
?
SQL Server 支持兩種類型的觸發(fā)器AFTER 觸發(fā)器和INSTEAD OF 觸發(fā)器,其中、
?
AFTER 觸發(fā)器要求只有執(zhí)行某一操作ISERT, UPDATE ,DELETE?之后觸發(fā)器才被觸
?
發(fā)。
?
?
1)INSTEAD OF 觸發(fā)器表示并不執(zhí)行其所定義的操作INSERT,UPDATE ,DELETE,而
?
僅是執(zhí)行觸發(fā)器本身,既可在表上定義INSTEAD OF 觸發(fā)器,也可以在視圖上定
?
義INSTEAD OF 觸發(fā)器。
?
2)after ?觸發(fā)器(也叫“FOR”觸發(fā)器)則會(huì)在觸發(fā) insert、update 或是delect 動(dòng)作之
后執(zhí)行。
?
觸發(fā)事件分為三類:UPDATE、DELETE和INSERT。
?
另外,定義觸發(fā)器時(shí),系統(tǒng)都都會(huì)自動(dòng)生成兩張表,我們是可以直接用的,如下:
?
如下是實(shí)例(都是親手實(shí)踐過的):
可在這里下載數(shù)據(jù)庫(kù)文件,下面實(shí)例以這個(gè)數(shù)據(jù)庫(kù)為例子
我想改為0的但改不了,小伙伴可以參照便文章免費(fèi)下載
也可以用百度網(wǎng)盤了:鏈接:https://pan.baidu.com/s/1gtlSrhQSBAd1rblrmU3JiA? 提取碼:q79b?
?
?
/*2. 在表Course中增加一個(gè)職業(yè)規(guī)劃選修課,為(005,職業(yè)規(guī)劃,4,0014),在表SC中建立一個(gè)觸發(fā)器, 實(shí)現(xiàn)規(guī)定年齡24歲以上(包括24歲)的學(xué)生才能選修職業(yè)規(guī)劃這門課程,如果年齡小于24歲,則輸出’ 年齡小于24,不能選修該門課程’,插入失敗,用SQL語(yǔ)句在SC表中分別插入(‘00001’,’005’,null)和 (‘00005’,’005’,null)看看結(jié)果;**/ create trigger t_sc on sc for insert as begindeclare @id char(5)select @id=sno from insertedif((select cno from inserted)='005' and (select sage from student where SNo= @id )<24)beginprint '年齡小于24,不能選修該門課程 'rollback transactionendelseprint 'nice!'end insert into course values('005','職業(yè)規(guī)劃','4','0014') insert into sc values('00001','005',null) insert into sc values('00005','005',null) select * from sc go 3.在表SC中建立更改觸發(fā)器,實(shí)現(xiàn)表SC中的修改后的成績(jī)不能低于修改前的成績(jī), 如果修改后的成績(jī)低于修改前的成績(jī),則輸出’修改后的成績(jī)比修改前低,不能修改’, 修改失敗,用SQL語(yǔ)句把學(xué)號(hào)為00001,課程號(hào)為001的成績(jī)分別改為90和70,看看結(jié)果;createtrigger t2_sc on sc
after update
as
if(update(score))
begin
? declare @score1 numeric(3,1),@score2numeric(3,1)
? select @score1=score from inserted
? select @score2=score from deleted
? if(@score1>@score2 )
?? print 'nice! '
?? else
??? update sc
??? set sc.Score=@score2 from sc,deleted
??? where sc.SNo=deleted.SNo andsc.CNo=deleted.CNo
??? print '失敗'
??? end
update sc
??? setScore=70 where SNo='00001' and CNo='001'
4. 在表Teacher中創(chuàng)建觸發(fā)器,實(shí)現(xiàn)如果更新了表Teacher中的年齡和工資, 則輸出’更新了年齡和工資’,如果更新了年齡沒有更新工資,則輸出’更新了年齡’, 如果更新了工資而沒有更新年齡,則輸出’更新了工資’,創(chuàng)建完后使用SQL語(yǔ)句把 tno為001的年齡加1,把tno為002的工資加1,把tno為003的年齡和工資都加1,看看結(jié)果; create trigger t_teacher on teacher after update as begindeclare @age int,@sal floatselect @age=age from deletedselect @sal=sal from deletedif(@age <> (select age from inserted )and @sal <>(select sal from inserted))print '更新了年齡和工資 'else if(@age <> (select age from inserted )and @sal =(select sal from inserted))print '更新了工資 'else if(@age = (select age from inserted )and @sal <>(select sal from inserted))print '更新了年齡 'endupdate Teacherset age=age+1 where Tno='0001'**/ /** 5. 在不刪除觸發(fā)器的前提下,使3創(chuàng)建的觸發(fā)器無(wú)效; alter table teacher disable trigger t_teacher**/ /** 6. 創(chuàng)建一個(gè)名為tri_Delete_C的觸發(fā)器,要求首先判斷數(shù)據(jù)庫(kù)中是否已經(jīng)存在名為tri_Delete_C的觸發(fā)器, 如果存在,首先刪除,再創(chuàng)建,觸發(fā)器要求刪除一門課程時(shí)候,首先判斷該課程有否有人選,如果有人選, 則不能刪除,并通過測(cè)試數(shù)據(jù)驗(yàn)證該觸發(fā)器的執(zhí)行情況。**/ if(exists (select * from sysobjects where xtype='tr' and name='tri_Delete_C')) begindrop trigger tri_Delete_Cprint '已刪除'endgocreate trigger tri_Delete_C on coursefor deleteas beginif exists (select * from sc inner join deleted on sc.CNo=deleted.CNo)beginprint '不能刪除'rollback transactionendendgoalter table sc drop constraint FK__sc__CNo__08B54D69delete course where CNo='001'alter table sc add constraint FK__sc__CNo__08B54D69 foreign key(cno) references course(cno)?
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的SQL SERVER触发器(附有实例)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: rapidxml解析xml文档
- 下一篇: 【触发器】数据库_触发器实例