這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)SqlServer中觸發(fā)器的作用是什么,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
創(chuàng)新互聯(lián)建站致力于互聯(lián)網(wǎng)品牌建設(shè)與網(wǎng)絡(luò)營銷,包括成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、SEO優(yōu)化、網(wǎng)絡(luò)推廣、整站優(yōu)化營銷策劃推廣、電子商務(wù)、移動(dòng)互聯(lián)網(wǎng)營銷等。創(chuàng)新互聯(lián)建站為不同類型的客戶提供良好的互聯(lián)網(wǎng)應(yīng)用定制及解決方案,創(chuàng)新互聯(lián)建站核心團(tuán)隊(duì)10余年專注互聯(lián)網(wǎng)開發(fā),積累了豐富的網(wǎng)站經(jīng)驗(yàn),為廣大企業(yè)客戶提供一站式企業(yè)網(wǎng)站建設(shè)服務(wù),在網(wǎng)站建設(shè)行業(yè)內(nèi)樹立了良好口碑。
查詢數(shù)據(jù)庫中所有觸發(fā)器:
select * from sysobjects where xtype='TR'
1、語法
create trigger [shema_name . ] trg_nameon { table | view }[ with encryption ]{ for | after | instead of }{ insert , update , delete }assql_statement
insert觸發(fā)器實(shí)例
create trigger teston alfor insertasdeclare @id int,@uid int,@lid int,@result charselect @id=id,@uid=uid,@lid=lid,@result=result from insertedif(@lid=4)begin update al set uid=99 where id=@id print 'lid=4時(shí)自動(dòng)修改用戶id為99'end
update觸發(fā)器實(shí)例
create trigger test_updateon al for updateas declare @oldid int,@olduid int,@oldlid int,@newid int,@newuid int,@newlid int select @oldid=id,@olduid=uid,@oldlid=lid from deleted; select @newid=id,@newuid=uid,@newlid=lid from inserted if(@newlid>@oldlid) begin print 'newlid>oldid' rollback tran; end else print '修改成功'
delete觸發(fā)器實(shí)例
create trigger test_deleteon alfor deleteasdeclare @did int,@duid int,@dlid intselect @did=id,@duid=uid,@dlid=lid from deletedif(exists(select * from list where @dlid=id))beginprint '無法刪除'rollback tran;endelseprint '刪除成功'
圖文介紹觸發(fā)器
數(shù)據(jù)庫運(yùn)行環(huán)境SqlServer2005
觸發(fā)器(trigger)是個(gè)特殊的存儲(chǔ)過程,它的執(zhí)行不是由程序調(diào)用,也不是手工啟動(dòng),而是由事件來觸發(fā),當(dāng)對一個(gè)表進(jìn)行操作( insert,delete, update)時(shí)就會(huì)激活它執(zhí)行,觸發(fā)器經(jīng)常用于加強(qiáng)數(shù)據(jù)的完整性約束和業(yè)務(wù)規(guī)則等。其實(shí)往簡單了說,就是觸發(fā)器就是一個(gè)開關(guān),負(fù)責(zé)燈的亮與滅,你動(dòng)了,它就亮了,就這個(gè)意思。
觸發(fā)器的分類
1 DML( 數(shù)據(jù)操縱語言 Data Manipulation Language)觸發(fā)器:是指觸發(fā)器在數(shù)據(jù)庫中發(fā)生DML事件時(shí)將啟用。DML事件即指在表或視圖中修改數(shù)據(jù)的insert、update、delete語句。
2 DDL(數(shù)據(jù)定義語言 Data Definition Language)觸發(fā)器:是指當(dāng)服務(wù)器或數(shù)據(jù)庫中發(fā)生(DDL事件時(shí)將啟用。DDL事件即指在表或索引中的create、alter、drop語句也。
3 登陸觸發(fā)器:是指當(dāng)用戶登錄SQL SERVER實(shí)例建立會(huì)話時(shí)觸發(fā)。
DML觸發(fā)器介紹
1 在SQL SERVER 2008中,DML觸發(fā)器的實(shí)現(xiàn)使用兩個(gè)邏輯表DELETED和INSERTED。這兩個(gè)表是建立在數(shù)據(jù)庫服務(wù)器的內(nèi)存中,我們只有只讀的權(quán)限。DELETED和INSERED表的結(jié)構(gòu)和觸發(fā)器所在的數(shù)據(jù)表的結(jié)構(gòu)是一樣的。當(dāng)觸發(fā)器執(zhí)行完成后,它們也就會(huì)被自動(dòng)刪除:INSERED表用于存放你在操件insert、update、delete語句后,更新的記錄。比如你插入一條數(shù)據(jù),那么就會(huì)把這條記錄插入到INSERTED表:DELETED表用于存放你在操作 insert、update、delete語句前,你創(chuàng)建觸發(fā)器表中數(shù)據(jù)庫。
2 觸發(fā)器可通過數(shù)據(jù)庫中的相關(guān)表實(shí)現(xiàn)級(jí)聯(lián)更改,可以強(qiáng)制比用CHECK約束定義的約束更為復(fù)雜的約束。與 CHECK 約束不同,觸發(fā)器可以引用其它表中的列,例如觸發(fā)器可以使用另一個(gè)表中的 SELECT 比較插入或更新的數(shù)據(jù),以及執(zhí)行其它操作。觸發(fā)器也可以根據(jù)數(shù)據(jù)修改前后的表狀態(tài),再行采取對策。一個(gè)表中的多個(gè)同類觸發(fā)器(INSERT、UPDATE 或 DELETE)允許采取多個(gè)不同的對策以響應(yīng)同一個(gè)修改語句。
3 與此同時(shí),雖然觸發(fā)器功能強(qiáng)大,輕松可靠地實(shí)現(xiàn)許多復(fù)雜的功能,為什么又要慎用?過多觸發(fā)器會(huì)造成數(shù)據(jù)庫及應(yīng)用程序的維護(hù)困難,同時(shí)對觸發(fā)器過分的依賴,勢必影響數(shù)據(jù)庫的結(jié)構(gòu),同時(shí)增加了維護(hù)的復(fù)雜程序。
觸發(fā)器步驟詳解
1 首先,我們來嘗試創(chuàng)建一個(gè)觸發(fā)器,要求就是在AddTable這個(gè)表上創(chuàng)建一個(gè)Update觸發(fā)器,語句為:
create trigger mytrigger on AddTablefor update
2 然后就是sql語句的部分了,主要是如果發(fā)生update以后,要求觸發(fā)器觸發(fā)一個(gè)什么操作。這里的意思就是如果出現(xiàn)update了,觸發(fā)器就會(huì)觸發(fā)輸出:the table was updated!---By 小豬也無奈。
3 接下來我們來將AddTable表中的數(shù)據(jù)執(zhí)行一個(gè)更改的操作:
4 執(zhí)行后,我們會(huì)發(fā)現(xiàn),觸發(fā)器被觸發(fā),輸出了我們設(shè)置好的文本:
5 那觸發(fā)器創(chuàng)建以后呢,它就正式開始工作了,這時(shí)候我們需要更改觸發(fā)器的話,只需要將開始的create創(chuàng)建變?yōu)閍lter,然后修改邏輯即可:
6 如果我們想查看某一個(gè)觸發(fā)器的內(nèi)容,直接運(yùn)行:exec sp_helptext [觸發(fā)器名]
7 如果我想查詢當(dāng)前數(shù)據(jù)庫中有多少觸發(fā)器,以方便我進(jìn)行數(shù)據(jù)庫維護(hù),只需要運(yùn)行:
select * from sysobjects where xtype='TR'
8 我們?nèi)绻枰P(guān)閉或者開啟觸發(fā)器的話,只需要運(yùn)行:
disable trigger [觸發(fā)器名] on database --禁用觸發(fā)器
enable trigger [觸發(fā)器名] on database --開啟觸發(fā)器
9 那觸發(fā)器的功能雖大,但是一旦觸發(fā),恢復(fù)起來就比較麻煩了,那我們就需要對數(shù)據(jù)進(jìn)行保護(hù),這里就需要用到rollback數(shù)據(jù)回滾~
10 第九步的意思就是查詢AddTable表,如果里面存在TableName=newTable的,數(shù)據(jù)就回滾,觸發(fā)器中止,那我們再進(jìn)行一下測試,對AddTable表進(jìn)行更改,發(fā)現(xiàn),觸發(fā)update觸發(fā)器之后,因?yàn)橛袛?shù)據(jù)保護(hù),觸發(fā)器中止:
注意事項(xiàng)
禁用和開啟觸發(fā)器都需要一定的權(quán)限,如果權(quán)限不夠是無法進(jìn)行操作的。
注意運(yùn)行后的錯(cuò)誤提示,對于糾正錯(cuò)誤是很有幫助的。
上述就是小編為大家分享的SqlServer中觸發(fā)器的作用是什么了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。