SQL語句(二十一)—— 觸發器(DML觸發器)
阿新 • • 發佈:2017-05-07
cti lock dml set sql語句 事件 check約束 服務 expand
一 、觸發器概述(特殊的存儲過程)
定義:
在修改指定表值的數據時執行的 存儲過程. 不同的是 : 執行存儲過程要使用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
-
SQL語句(二十一)—— 觸發器(DML觸發器)