SQL語句(二十一)—— 觸發器(DML觸發器)


觸發器

一 、觸發器概述(特殊的存儲過程)

定義:

在修改指定表值的數據時執行的 存儲過程. 不同的是 : 執行存儲過程要使用EXEC語句來調用,而觸發器的執行不需要使用EXEC語句來調用.

作用:

  1. 實現由主鍵和外鍵所不能保證的復制的參照完整性和數據的一致性

  1. 他能夠對數據庫中的相關表進行級聯修改

  2. 提供比 CHECK約束 更復雜的數據完整性,並自定義錯誤信息。

分類:

  1. 數據操作語言觸發器 DML

    • 數據庫操作語言 : update,Delete

  2. 數據定義語言觸發器 DDL

    • 記錄數據庫更改事件

二、創建DML觸發器

  • INSERT 觸發器

  • DELETE 觸發器

  • UPDATE 觸發器

  • 替代觸發器

  • 允許使用嵌套觸發器

  • 遞歸觸發器

5.25: 在Employee表上創建一個名為Employee_deleted的觸發器,其功能: 當對表進行刪除時,首先檢查員工是否為 '人事部'員工,如果不是可以刪除,否則撤銷刪除並顯示'無法刪除'

Create trigger employee_delete on Department After Delete AS Begin Declary @x char(10) Select @x = DepartmentName --變量來自數據庫,用from From Department if (@x = '人事部') --沒有就用變量 Begin print '無法刪除' RollBack --撤銷都是RollBack End End --執行 Delete From Department Where Sname = '人事部'
  • 先刪除,再撤銷

Create trigger employee_delete on Employee After Delete AS Begin Declare @Dp varchar(50) Select @Dp = DepartmentName From Department D1, Deleted D2 Where D1.DepartmentID = D2.DepartmentID If(@Dp = '人事部') Begin print '無法刪除' RollBack End End
  • 更新觸發器(返回更新的記錄)

Create trigger employee_update on Stu_info After Update AS Begin Declare @StuCount Int Select @StuCount = Count(*) From stu_info Update Stu_sum Set number = @StuCount Select S_id As 更新前學生編號, S_name As 更新前學生姓名 From Deleted Select S_id As 更新后學生編號, S_name As 更新后學生姓名 From Inserted End --執行 Update Stu_info Set S_name = '張三' Where S_id = 1
  • Instead of (替代觸發器)先判斷,再操作

Create trigger employee_delete on Employee Instead of Delete AS Begin Declare @Dp varchar(50) Select @Dp = DepartmentName From Department If(@Dp = '人事部') Begin print '無法刪除' End End
  • 禁止直接向表插入記錄 操作

Create Trigger Insert_Forbidden On Stu_Sum After Insert AS Begin Raiserror('不允許直接向該表插入記錄, 操作被禁止', 1, 1) RollBack Transaction End
  • 觸發器嵌套

    • 服務器 - > 屬性 -> 雜項 -> 允許觸發器激發其他觸發器 -> true

  • 遞歸觸發器

    • 數據庫 -> 屬性 -> 選項 -> 雜項 -> 遞歸觸發器已啟用 -> true

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM