日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

SQL SERVER触发器(附有实例)

發(fā)布時(shí)間:2024/8/1 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL SERVER触发器(附有实例) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

觸發(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ā)事件分為三類:UPDATEDELETEINSERT。

?

另外,定義觸發(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?
?

1.在表Student中建立刪除觸發(fā)器,實(shí)現(xiàn)表Student和表SC的級(jí)聯(lián)刪除,也就是只要?jiǎng)h除表Student 中的元組學(xué)號(hào)為s1,則表SC中SNO為s1的元組也要?jiǎng)h除;建立完觸發(fā)器后用企業(yè)管理器刪除Student中學(xué)號(hào) 為30的元組,看看表SC中SNO為30的選課記錄是否也一起刪除;create trigger t_std2 on student instead of delete as begindeclare @id char(5)select @id=sno from deleteddelete from sc where SNo =@iddelete from student where SNo=@idendgodelete from Student where SNo='00002'

?

/*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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。