1. 程式人生 > >SQL語句(二十一)—— 觸發器(DML觸發器)

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

cti lock dml set sql語句 事件 check約束 服務 expand

觸發器

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

定義:

在修改指定表值的數據時執行的 存儲過程. 不同的是 : 執行存儲過程要使用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

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