SQL Server2000 觸發(fā)器
當(dāng)前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
觸發(fā)器是一種特殊的存儲過程,在用戶試圖對指定的表執(zhí)行指定的數(shù)據(jù)修改語句時自動執(zhí)行。創(chuàng)建語法:
引用內(nèi)容 Create TRIGGER trigger_name ON {table | view} {INSTEAD OF | AFTER} {[Insert] [,] [Update] [,] [Delete]} AS sql_statement 下邊主要說下INSTEAD OF和AFTER兩個參數(shù)的區(qū)別: ·執(zhí)行時間:INSTEAD OF在SQL語句執(zhí)行前觸發(fā),并且SQL語句不會再執(zhí)行;AFTER則是在SQL語句執(zhí)行后觸發(fā)。 ·適用對象:INSTEAD OF適用于表和視圖;AFTER只能用于表。 ·數(shù)量:Insert、Update和Delete允許有多個AFTER觸發(fā)器,但只能有一個INSTEAD OF觸發(fā)器。 再來說說觸發(fā)器中經(jīng)常會用到的兩張表:inserted和deleted。這兩張表在結(jié)構(gòu)上類似于定義觸發(fā)器的表,其中inserted存放的是Insert的記錄或Update后的新記錄,deleted存放的是Delete的記錄或Update前的舊記錄。例如當(dāng)觸發(fā)器中SQL語句的執(zhí)行條件是判斷新增記錄某個字段值來進行的,那么就得從inserted獲取新增記錄。 示例 程序代碼 /* download表增加一條記錄時更新天預(yù)統(tǒng)計表count1 */ Create TRIGGER DownCountTR ON download AFTER Insert AS IF @@rowcount>0 BEGIN DECLARE @date1 datetime --從Inserted表中獲取新下載的時間 Select @date1=convert(nvarchar(10),regtime,120) FROM Inserted --更新count1表 IF exists(Select * FROM count1 Where regtime=@date1) Update count1 SET downcount=downcount+1 Where regtime=@date1 ELSE Insert INTO count1(downcount,regtime) VALUES(1,@date1) END 程序代碼 /* 禁止對表的更新和刪除 */ Create TRIGGER STOP ON dbo.table1 INSTEAD OF Update, Delete AS RETURN 遞歸觸發(fā)器 當(dāng)在 sp_dboption 中啟用 recursive triggers 設(shè)置時,SQL Server 還允許觸發(fā)器的遞歸調(diào)用。遞歸觸發(fā)器允許發(fā)生兩種類型的遞歸: ·間接遞歸 ·直接遞歸 使用間接遞歸時,應(yīng)用程序更新表 T1,從而激發(fā)觸發(fā)器 TR1,該觸發(fā)器更新表 T2。在這種情況下,觸發(fā)器 T2 將激發(fā)并更新 T1。 使用直接遞歸時,應(yīng)用程序更新表 T1,從而激發(fā)觸發(fā)器 TR1,該觸發(fā)器更新表 T1。由于表 T1 被更新,觸發(fā)器 TR1 再次激發(fā),依此類推。 說明 只有啟用 sp_dboption 的 recursive triggers 設(shè)置,才會發(fā)生上述行為。對于為給定事件定義的多個觸發(fā)器,并沒有確定的執(zhí)行順序。每個觸發(fā)器都應(yīng)是自包含的。禁用 recursive triggers 設(shè)置只能禁止直接遞歸。若要也禁用間接遞歸,請使用 sp_configure 將 nested triggers 服務(wù)器選項設(shè)置為 0。 如果任一觸發(fā)器執(zhí)行了 ROLLBACK TRANSACTION 語句,則無論嵌套級是多少,都不會進一步執(zhí)行其它觸發(fā)器。 嵌套觸發(fā)器 觸發(fā)器最多可以嵌套 32 層。如果一個觸發(fā)器更改了包含另一個觸發(fā)器的表,則第二個觸發(fā)器將激活,然后該觸發(fā)器可以再調(diào)用第三個觸發(fā)器,依此類推。如果鏈中任意一個觸發(fā)器引發(fā)了無限循環(huán),則會超出嵌套級限制,從而導(dǎo)致取消觸發(fā)器。若要禁用嵌套觸發(fā)器,請用 sp_configure 將 nested triggers 選項設(shè)置為 0(關(guān)閉)。默認配置允許嵌套觸發(fā)器。如果嵌套觸發(fā)器是關(guān)閉的,則也將禁用遞歸觸發(fā)器,與 sp_dboption 的 recursive triggers 設(shè)置無關(guān)。 該文章在 2011/3/14 15:09:04 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |