小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

觸發(fā)器--特殊的存儲過程

 昵稱10504424 2013-02-20
 很多人應(yīng)該都用過存儲過程和觸發(fā)器,而觸發(fā)器并不是一個新的概念,它只是一個特殊一些的存儲過程, 它可以根據(jù)執(zhí)行的TQL 語句自動執(zhí)行,不需要我們?nèi)フ{(diào)用。

           觸發(fā)器是為了數(shù)據(jù)庫表結(jié)構(gòu)的完成性、一致性而使用的,和單個表的約束一樣,觸發(fā)器是對于表之間的約束,它比主鍵約束范圍更廣泛一些,作用范圍更大一些,下面給大家介紹一下常用的三種觸發(fā)器.

 

           【插入觸發(fā)器(Insert Trigger)】

           當(dāng)向表里面插入記錄時候觸發(fā)

           通過臨時表(Inserted)來實現(xiàn),我們需要往表里插入一條記錄時,插入的記錄先插入到臨時表中,然后,從臨時表插入到目標(biāo)表中,為什么采用臨時表,我覺的是因為觸發(fā)器是自動觸發(fā),既然是自動觸發(fā)就不會往里面?zhèn)鲄?shù),那么參數(shù)怎么傳入到目標(biāo)表中呢,為了傳入?yún)?shù)加入了臨時表,將要插入或者刪除的記錄先放到了臨時表中,再從臨時表插入數(shù)據(jù)。

 

          下面是一個校區(qū)的基本表TB_Campus,向表里插入數(shù)據(jù)時觸發(fā)該觸發(fā)器,自動向該小區(qū)下的建筑表TB_Building添加數(shù)據(jù)記錄,從而保證這兩個表的數(shù)據(jù)一致性。

           觸發(fā)器通常是為了兩個表或多個表中數(shù)據(jù)一致加入的。

          例如:

 

           【更新觸發(fā)器(Update Trigger)】

            當(dāng)更新表中的任意一個字段時觸發(fā)

            更新觸發(fā)器需要用到兩個表,一個是Inserted 表,另一個是Deleted表,Inserted表存儲更新后的記錄,Deleted表存儲更新后的記錄,更新一個表示需要先將要刪除的記錄放入Deleted表中,然后,將Inserted表的新記錄插入表中,從而實現(xiàn)更新操作。

 

            例如:下面是教務(wù)系統(tǒng)中一個觸發(fā)器,更新老師課程關(guān)系表(TR_TeachCourseLink)記錄,并更新與這個表有關(guān)的表。

 

            在更新、刪除觸發(fā)器中我們需要注意一個問題,觸發(fā)器為什么會觸發(fā)呢,它是基于SQL 語句而執(zhí)行的,但更新、刪除語句可以一次性刪除多條記錄,其實SQL 語句只執(zhí)行了一次,即觸發(fā)器也只執(zhí)行一次,那么當(dāng)涉及到表關(guān)系為一對多或者多對多時,就會出現(xiàn)更新或刪除不完下面表中記錄

          

            為了解決這一問題,我們在下面存儲過程中加入了游標(biāo),使得更新或刪除記錄時一條一條的刪除,每刪除一條,觸發(fā)器就會執(zhí)行一次,使得數(shù)據(jù)保持一致,不過,這樣可能大大降低了SQL語句執(zhí)行速度,如果數(shù)據(jù)量很大,速度會變慢。

 

  1. <SPAN style="FONT-SIZE: 18px">USE [BasicDataSystem]  
  2. GO  
  3. /****** Object:  Trigger [dbo].[TR_TeachCourseLink_US]    Script Date: 2013/1/2 19:28:42 ******/  
  4. SET ANSI_NULLS ON  
  5. GO  
  6. SET QUOTED_IDENTIFIER ON  
  7. GO  
  8. -- =============================================   
  9. -- Author:      評教小組-李龍生   
  10. -- Create date:      2012年12月30日21:03:26   
  11. -- Description:  假刪除授課表中課表記錄   
  12. --                   授課課程與虛擬班關(guān)系、虛擬班   
  13. --           授課課程與上課班學(xué)生關(guān)系、上課班學(xué)生   
  14. --                   課程與選修課學(xué)生關(guān)系、選修課學(xué)生   
  15. -- =============================================   
  16. ALTER TRIGGER [dbo].[TR_TeachCourseLink_US]  
  17.       
  18.     ON [dbo].[TBR_TeachCourseLink]  
  19.   
  20.     AFTER Update  
  21. AS  
  22.       
  23.     DECLARE  
  24.     @err1 INT,                   --存儲錯誤號   
  25.     @err2 INT,  
  26.     @err3 INT,  
  27.     @err4 INT,  
  28.     @err5 INT,  
  29.     @err6 INT,  
  30.     @err7 INT,  
  31.     @Indexing INT,               --授課課程主鍵   
  32.     @TeachClassID VARCHAR(36),   --虛擬班主鍵   
  33.     @StudentID VARCHAR(36)       --學(xué)生主鍵   
  34.   
  35. BEGIN  
  36.   
  37.     --選擇要刪除授課課程記錄的主鍵   
  38.     SELECT @Indexing=Indexing FROM  <SPAN style="COLOR: #3333ff"><STRONG>deleted    --刪除臨時表   
  39. </STRONG></SPAN>      
  40.     --開啟事務(wù)   
  41.     BEGIN TRANSACTION  
  42.   
  43.         /*更新授課課程記錄、授課課程與虛擬班關(guān)系、虛擬班,各表中的IsAvailable   
  44.         字段為 “否”*/  
  45.   
  46.         --更新授課課程記錄 IsAvailable='否'   
  47.         UPDATE TBR_TeachCourseLink SET IsAvailable='否' WHERE Indexing=@Indexing  
  48.         SET @err1=@@ERROR  
  49.   
  50.         --更新虛擬班與TeachCourse表的關(guān)系 IsAvailable='否'   
  51.         UPDATE TBR_CourseTeachClassLink SET IsAvailable='否' WHERE Indexing=@Indexing  
  52.         SET @err2=@@ERROR  
  53.   
  54.         --更新虛擬班表 IsAvailable='否'(需要觸發(fā)多條記錄,用游標(biāo)操作)   
  55. <SPAN style="COLOR: #cc33cc"><STRONG>       --聲明游標(biāo)   
  56.         DECLARE TeachClassCursor CURSOR FOR    
  57.         SELECT TeachClassID FROM TBR_CourseTeachClassLink  WHERE Indexing=@Indexing   
  58.         --打開游標(biāo)   
  59.             OPEN TeachClassCursor  
  60.                 FETCH NEXT FROM TeachClassCursor INTO @TeachClassID  --給變量賦初始值   
  61.                 WHILE @@FETCH_STATUS=0 --語句執(zhí)行成功   
  62.                     BEGIN  
  63.                     --更新中的記錄   
  64.                     Update TB_TeachClass SET isAvailable = '否' WHERE TeachClassID=@TeachClassID   
  65.                     FETCH NEXT FROM TeachClassCursor INTO @TeachClassID  
  66.                     END  
  67.             --關(guān)閉并釋放游標(biāo)   
  68.             CLOSE TeachClassCursor  
  69.         DEALLOCATE TeachClassCursor  
  70. </STRONG></SPAN>        SET @err3=@@ERROR  
  71.   
  72.         /*更新授課課程與選修課學(xué)生關(guān)系、學(xué)生表,各表中的IsAvailable   
  73.         字段為 “否”*/  
  74.         --更新授課課程與選修課學(xué)生的關(guān)系表IsAvailable='否'   
  75.         UPDATE TBR_StuChooseCourseLink SET IsAvailable='否' WHERE Indexing=@Indexing  
  76.         SET @err6=@@ERROR  
  77.   
  78.         --更新學(xué)生表,將IsAvailable字段變?yōu)?否'(需要觸發(fā)多條記錄,用游標(biāo)操作)   
  79.         --聲明游標(biāo)   
  80.         DECLARE StudentCursor CURSOR FOR    
  81.         SELECT StudentID FROM TBR_StuChooseCourseLink  WHERE Indexing=@Indexing   
  82.         --打開游標(biāo)   
  83.             OPEN StudentCursor  
  84.                     FETCH NEXT FROM StudentCursor INTO @StudentID  --給變量賦初始值   
  85.                     WHILE @@FETCH_STATUS=0 --語句執(zhí)行成功   
  86.                     begin  
  87.                     --更新中的記錄   
  88.                     Update TB_Student SET isAvailable = '否' WHERE StudentID=@StudentID  
  89.                     FETCH NEXT FROM StudentCursor INTO @StudentID  
  90.                     end  
  91.             --關(guān)閉并釋放游標(biāo)   
  92.             CLOSE StudentCursor  
  93.         DEALLOCATE StudentCursor  
  94.         SET @err7=@@ERROR  
  95.   
  96.     --判斷是否執(zhí)行成功   
  97.     IF (@err1 =0 and @err2=0 and @err3=0 and @err4=0 and @err5=0 and @err6=0 and @err7=0)  
  98.         --提交事務(wù)   
  99.         COMMIT TRANSACTION  
  100.     ELSE  
  101.         --事務(wù)回滾   
  102.         ROLLBACK TRANSACTION  
  103.   
  104.   
  105. END</SPAN>  

 

           【刪除觸發(fā)器(Delete Trigger)】

            當(dāng)刪除表中記錄時觸發(fā)

            先把要刪除的記錄放到Deleted臨時表中,然后,再刪除。

             例如:

  1. <SPAN style="FONT-SIZE: 18px">USE [BasicDataSystem]  
  2. GO  
  3. /****** Object:  Trigger [dbo].[TR_TeachCourseLink_D]    Script Date: 2013/1/2 19:29:42 ******/  
  4. SET ANSI_NULLS ON  
  5. GO  
  6. SET QUOTED_IDENTIFIER ON  
  7. GO  
  8. -- =============================================   
  9. -- Author:      評教小組-李龍生   
  10. -- Create date:      2012年12月30日21:03:26   
  11. -- Description: 徹底刪除授課表中課表記錄   
  12. --                   課程與選修課學(xué)生關(guān)系、選修課學(xué)生   
  13. -- =============================================   
  14. ALTER TRIGGER [dbo].[TR_TeachCourseLink_D]  
  15.       
  16.     ON [dbo].[TBR_TeachCourseLink]  
  17.   
  18.     INSTEAD OF DELETE  
  19. AS  
  20.       
  21.     DECLARE  
  22.     @err1 INT,                   --存儲錯誤號   
  23.     @err2 INT,  
  24.     @err3 INT,  
  25.     @err4 INT,  
  26.     @err5 INT,  
  27.     @err6 INT,  
  28.     @err7 INT,  
  29.     @Indexing INT,               --授課課程主鍵   
  30.     @TeachClassID VARCHAR(36),           --虛擬班主鍵   
  31.     @StudentID VARCHAR(36)               --學(xué)生主鍵   
  32.   
  33. BEGIN  
  34.   
  35.     --選擇要刪除授課課程記錄的主鍵   
  36.     SELECT @Indexing=Indexing FROM  <SPAN style="COLOR: #3333ff"><STRONG>deleted  --刪除臨時表</STRONG>   
  37. </SPAN>   
  38.     --開啟事務(wù)   
  39.     BEGIN TRANSACTION  
  40.   
  41.         /*刪除授課課程記錄、授課課程與虛擬班關(guān)系、虛擬班   
  42.         字段為 “否”*/  
  43.   
  44.         --徹底刪除授課課程記錄   
  45.         DELETE TBR_TeachCourseLink  WHERE Indexing=@Indexing AND IsAvailable='否'  
  46.         SET @err1=@@ERROR  
  47.   
  48.         /*刪除授課課程與選修課學(xué)生關(guān)系、學(xué)生表  
  49.         字段為 “否”*/  
  50.         --刪除授課課程與選修課學(xué)生的關(guān)系表   
  51.         DELETE TBR_StuChooseCourseLink   WHERE Indexing=@Indexing and IsAvailable='否'  
  52.         SET @err6=@@ERROR  
  53.   
  54.         --刪除學(xué)生表(需要觸發(fā)多條記錄,用游標(biāo)操作)   
  55.         --聲明游標(biāo)   
  56.         DECLARE StudentCursor CURSOR FOR    
  57.         SELECT StudentID FROM TBR_StuChooseCourseLink  WHERE Indexing=@Indexing   
  58.         --打開游標(biāo)   
  59.             OPEN StudentCursor  
  60.                     FETCH NEXT FROM StudentCursor INTO @StudentID  --給變量賦初始值   
  61.                     WHILE @@FETCH_STATUS=0 --語句執(zhí)行成功   
  62.                     begin  
  63.                     --更新中的記錄   
  64.                     DELETE TB_Student WHERE StudentID=@StudentID and  isAvailable = '否'   
  65.                     FETCH NEXT FROM StudentCursor INTO @StudentID  
  66.                     end  
  67.             --關(guān)閉并釋放游標(biāo)   
  68.             CLOSE StudentCursor  
  69.         DEALLOCATE StudentCursor  
  70.         SET @err7=@@ERROR  
  71.   
  72.     --判斷是否執(zhí)行成功   
  73.     IF (@err1 =0 and @err2=0 and @err3=0 and @err4=0 and @err5=0 and @err6=0 and @err7=0)  
  74.         --提交事務(wù)   
  75.         COMMIT TRANSACTION  
  76.     ELSE  
  77.         --事務(wù)回滾   
  78.         ROLLBACK TRANSACTION  
  79.   
  80.   
  81. END</SPAN>  


           觸發(fā)器的工作原理以及什么時候使用兩張臨時表進行操作,可以用下面這張圖表示:Inserted和Deleted兩個臨時表實現(xiàn)。

 

 

 

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多