一 、觸發器概述(特殊的存儲過程)
定義:
在修改指定表值的數據時執行的 存儲過程. 不同的是 : 執行存儲過程要使用EXEC語句來調用,而觸發器的執行不需要使用EXEC語句來調用.
作用:
實現由主鍵和外鍵所不能保證的復制的參照完整性和數據的一致性
他能夠對數據庫中的相關表進行級聯修改
提供比 CHECK約束 更復雜的數據完整性,並自定義錯誤信息。
分類:
數據操作語言觸發器 DML
數據庫操作語言 : update,Delete
數據定義語言觸發器 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
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
-