sql觸發器使用及實例

 

  
  
  
  
  1.  
  2. ---觸發器 一種特殊的存儲過程,觸發器主要是經過事件進行觸發被自動調用執行的。而存儲過程能夠經過存儲過程的名稱被調用  
  3. --觸發器是當對某一個表進行操做。諸如:update、insert、delete這些操做的時候,系統會自動調用執行該表上對應的觸發器  
  4. --SQL Server 2005中觸發器能夠分爲兩類:DML觸發器和DDL觸發器,其中DDL觸發器它們會影響多種數據定義語言語句而激發,這些語句有create、alter、drop語句。  
  5.  
  6. --DML 觸發器分爲    
  7.  
  8.   --一、 after觸發器(以後觸發)   
  9.  
  10.   --      a、 insert觸發器   
  11.  
  12.   --      b、 update觸發器   
  13.  
  14.   --      c、 delete觸發器   
  15.  
  16.     --PS:其中after觸發器要求只有執行某一操做insert、update、delete以後觸發器才被觸發,且只能定義在表上  
  17.  
  18.   --  二、 instead of 觸發器 (以前觸發)   
  19.  
  20. --PS:而instead of觸發器表示並不執行其定義的操做(insert、update、delete)而僅是執行觸發器自己。既能夠在表上定義instead of觸發器,也能夠在視圖上定義  
  21.  
  22.   --觸發器有兩個特殊的表:插入表(instered表)和刪除表(deleted表)。這兩張是邏輯表也是虛表。  
  23.   --有系統在內存中建立者兩張表,不會存儲在數據庫中。並且兩張表的都是隻讀的,只能讀取數據而不能修改數據。  
  24.   --這兩張表的結果老是與被改觸發器應用的表的結構相同。當觸發器完成工做後,這兩張表就會被刪除。  
  25.   --Inserted表的數據是插入或是修改後的數據,而deleted表的數據是更新前的或是刪除的數據。  
  26.  
  27.  
  28. --create trigger trg_name  
  29. --on table_name  
  30. --with encryption --加密觸發器  
  31. --   for update......  
  32. --as   
  33. --  Transact-SQL  
  34.  
  35. ---建立Insert插入類型觸發器  
  36. if(OBJECT_ID ('trg_insert','tr')is not null)  
  37.     drop trigger trg_insert   
  38. go  
  39. create trigger trg_insert  
  40. on student2  
  41.     for insert --插入觸發 (向student2插入記錄,會插入相同的name 到student 表中)  
  42. as   
  43.     --定義變量  
  44.     declare @id int,@name varchar(20),@sex int;  
  45.     select @idid=id,@namename=name from inserted;--從inserted 表中取出插入的記錄  
  46.     set @name=@name+CONVERT(varchar,@id);  
  47.     insert into student values(@name,1,'ddd',GETDATE (),GETDATE (),GETDATE ());  
  48.     print 'student添加學生成功'  
  49. go  
  50.  
  51. --測試  
  52. insert into student2 values('insertName',1,'insertClass')  
  53. select * from student2  
  54. select * from student  
  55.  
  56.  
  57. ---- 建立刪除類型觸發器  
  58. if(OBJECT_ID ('tgr_delete','tr')is not null)  
  59.     drop trigger tgr_delete   
  60. go    
  61.     create trigger [dbo].[tgr_delete]  
  62.     on [dbo].[student2]  
  63.         for delete --將刪除student2的記錄,存入到另張表中  
  64.     as   
  65.         print '備份數據中'  
  66.         if(object_id('student2BackUp','U')is not null )  
  67.          insert into student2BackUp select name,sex ,class from deleted --從deleted表中取出刪除的表  
  68.         else   
  69.          select * into student2BackUp from deleted  
  70.         print '備份數據成功'  
  71.  
  72. go  
  73.  
  74. --測試  
  75. delete student2 where id=3 
  76. select * from student2  
  77. select * from student2BackUp   
  78.  
  79.  
  80. --建立update類型的觸發器  
  81.  
  82. if(OBJECT_ID ('tgr_update','tr')is not null)  
  83.     drop trigger tgr_update  
  84.        
  85. go  
  86.  
  87.     create trigger [dbo].[tgr_update]  
  88.     on [dbo].[student2] ---將student2中更新的記錄級聯更新到student表中(若student表中存在對應的記錄)  
  89.         for update  
  90.     as  
  91.         declare @oldName varchar(20),@newName varchar(20)  
  92.         --更新前的數據  
  93.         select @oldName =name from deleted--從deleted表中取刪除的老名字  
  94.         print @oldName  
  95.         if(exists(select * from student where name like '%'+@oldName+'%'))  
  96.         begin   
  97.             select @newName=name from inserted --從inserted表中取出更新後的新名字  
  98.             update student set name=REPLACE (name,@oldName ,@newName )  
  99.             where name like '%'+@oldName +'%'  
  100.             print '級聯修改數據成功'  
  101.         end  
  102.         else  
  103.             print '無需修改student表'  
  104.  
  105. GO  
  106.  
  107. --測試  
  108. update student2 set name='updateName' where id=4 
  109. select * from student2   
  110. select * from student   
  111.       
  112.       
  113. ---建立instead of 觸發器  
  114.  
  115. if(OBJECT_ID ('tgr_insteadOf','tr')is not null)  
  116. drop trigger tgr_insteadOf  
  117.       
  118. go    
  119.       
  120.     create trigger [dbo].[tgr_insteadOf]  
  121.     on [dbo].[student2]  
  122.         instead of delete --update ,insert  
  123.     as   
  124.         declare @name varchar(20)  
  125.     select @namename=name from deleted  
  126.  
  127.     delete student where name=@name  
  128.     print 'name'+@name+'刪除成功!'  
  129. go   
  130.  
  131.  
  132.  
  133.  
  134. --測試   
  135. select * from student2  
  136. select *  from student   
  137. delete student2 where id=19 
  138. select *  from student2   
  139. select *  from student --其實只刪除了student表中的記錄  
  140.      

 

 

 

  
  
  
  
  1.  
  2. --建立updatecolumn類型觸發器  
  3.  
  4. if(OBJECT_ID ('tgr_update_column','tr')is not null)  
  5. drop trigger tgr_update_column   
  6.  
  7. go  
  8.  
  9. create trigger [dbo].[tgr_update_column]  
  10. on [dbo].[student2]   
  11.     for update  
  12. as   
  13.     if(update(sex))  
  14.     begin   
  15.         raisError('性別不能隨意設置',16,11)  
  16.         rollback tran  
  17.     end   
  18.  
  19. GO    
  20.  
  21. --測試  
  22. update student2 set sex=1 where sex is null  

 

  
  
  
  
  1. ---刪除觸發器  
  2. drop trigger trigger_name  
  3.  
  4. --查看數據庫中已有觸發器  
  5. select *  from sysobjects where xtype='tr' 
  6.  
  7. --查看單個觸發器  (定義的文本)  
  8. exec sp_helptext 'trg_insert' --‘觸發器名’  
  9.  
  10. --修改觸發器  
  11.     alter trigger trigger_name  
  12.            on {table_name | view_name}  
  13.            {for | After | Instead of }  
  14.            [ insert, update,delete ]  
  15.            as  
  16.            sql_statement 

 PS: 一個表或視圖的每個修改動做(insert,update和delete)均可以有一個instead of 觸發器﹐一個表的每一個修改動做均可以有多個After觸發器。sql

相關文章
相關標籤/搜索