1. 程式人生 > >SQL資料庫(5)——資料庫完整性----觸發器

SQL資料庫(5)——資料庫完整性----觸發器

觸發器是一種特殊的儲存過程,當用戶對錶中的資料進行update、insert或delete操作時自動觸發執行,通常用於保障業務規則和資料完整性

觸發器的常用功能

  • 完成比約束更復雜的資料約束
  • 檢查所做的sql是否允許
  • 呼叫更多的儲存過程
  • 防止資料表結構更改或資料表被刪除
  • 修改其他資料表的資料
  • 傳送sql mail
  • 返回自定義的錯誤資訊

建立

常用DML觸發器,即資料庫中發生資料操作語言(insert、update、delete)事件時執行的儲存過程

create trigger 觸發器名稱
on {表名 | 檢視名}
{ for| after| instead of
} { [insert] [ , ] [delete] [ , ] [update] } as sql 語句
  1. 一個表上可以建立多個觸發器
  2. 對於after型觸發器,可以在同一種操作上建立多個觸發器;對於instead of型觸發器,在同一種操作上只能建立一個觸發器
  3. 不允許在觸發器中建立和更改資料庫以及資料庫物件的語句、以及多有的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 觸發器名

注意事項

  1. 一個表可以有多個觸發器,但一個觸發器只能對應一個表,但可以引用資料庫以外的物件
  2. 同一個資料表中,對每個操作而言,可以建立多個after觸發器,但instead of 觸發器只能建立一個
  3. 對某個操作,既建了after觸發器,又設定了instead of觸發器,instead of觸發器一定會啟用,after觸發器不一定會被啟用