SQL資料庫(5)——資料庫完整性----觸發器
阿新 • • 發佈:2019-01-22
觸發器是一種特殊的儲存過程,當用戶對錶中的資料進行update、insert或delete操作時自動觸發執行,通常用於保障業務規則和資料完整性
觸發器的常用功能
- 完成比約束更復雜的資料約束
- 檢查所做的sql是否允許
- 呼叫更多的儲存過程
- 防止資料表結構更改或資料表被刪除
- 修改其他資料表的資料
- 傳送sql mail
- 返回自定義的錯誤資訊
建立
常用DML觸發器,即資料庫中發生資料操作語言(insert、update、delete)事件時執行的儲存過程
create trigger 觸發器名稱
on {表名 | 檢視名}
{ for| after| instead of }
{ [insert] [ , ]
[delete] [ , ]
[update] }
as
sql 語句
- 一個表上可以建立多個觸發器
- 對於after型觸發器,可以在同一種操作上建立多個觸發器;對於instead of型觸發器,在同一種操作上只能建立一個觸發器
- 不允許在觸發器中建立和更改資料庫以及資料庫物件的語句、以及多有的drop語句
啟用觸發器的動作 | insert表 | deleted表 |
---|---|---|
insert | 存放要插入的記錄 | |
update | 存放要更新的記錄 | 存放更新前的舊記錄 |
delete | 存放要刪除的舊記錄 |
後觸發型觸發器
使用for或after選項定義的觸發器
執行過程如下
1. 執行到引發觸發器執行的語句
2. 執行該語句
3. 執行觸發器
create trigger basspay
on 僱員
after inster,update
as
if exists(
select * from 僱員 a,工作 b
on a.工作編號=b.工作編號
where 工資 between 最低工資 and 最高工資
)
begin
print'插入或更新資料出錯'
rollback //撤銷已執行的操作
end
觸發器和引發觸發器執行的操作共同構成了一個事務,事務的開始是引發觸發器執行的操作,事務的結束是觸發器的結束
工作原理
記錄改變後才會被啟用執行,它主要用於記錄改變後的處理和檢查,一旦發現錯誤,可用rollback transaction語句回滾本次操作
前觸發型觸發器
使用instead of選項定義的觸發器
執行過程如下:
1. 執行到引發觸發器執行的語句
2. 執行觸發器(執行觸發器而不是執行引發觸發器的SQL語句,從而代替引發語句的操作)
create trigger floaypay
on 僱員
instead of update
as
if not exists(
select * from inserted
where 浮動工資> 工資*0.3
)
update 僱員 set 浮動工資=(
select 浮動工資 from inserted i
where 僱員。僱員編號= i.僱員編號
)
else
print'浮動工資不能高於工資的30%'
//限制不能將“浮動工資”列的值改為超過該僱員工資的30%,如果違反約束給出提示資訊:“浮動工資不能高於工資的30%”
通常在以下幾種情況下,建議使用instead of觸發器
1. 資料庫中的資料禁止修改,此時可以使用該處發起來跳過update修改記錄的SQL語句
2. 有可能要回滾修改的SQL語句:避免在修改資料後再回滾,減少伺服器負擔
3. 在檢視中使用觸發器,因為after觸發器不能再檢視中使用
4. 自定義修改資料,控制資料的修改方式和流程
工作原理
在記錄變更之前發生,並不去執行原來的SQL語句裡的操作,而去執行觸發器本身所定義的操作
觸發器的刪除
drop trigger 觸發器名
注意事項
- 一個表可以有多個觸發器,但一個觸發器只能對應一個表,但可以引用資料庫以外的物件
- 同一個資料表中,對每個操作而言,可以建立多個after觸發器,但instead of 觸發器只能建立一個
- 對某個操作,既建了after觸發器,又設定了instead of觸發器,instead of觸發器一定會啟用,after觸發器不一定會被啟用