在數據庫管理系統中,觸發器(Trigger)是一種特殊的存儲過程,它在特定的事件發生時自動執行。觸發器通常用于維護數據的完整性和一致性。通過事件觸發而被執行,不能直接調用。
觸發器的三要素
觸發事件 before/after(insert、update、delete)
觸發條件 when
觸發動作 begin ... end
觸發器的分類
根據觸發時機和觸發事件的不同,觸發器可以分為以下幾種類型:行級觸發器與語句級觸發器
行級觸發器(Row-Level Trigger)在每一行數據受到影響時觸發,例如在插入、更新或刪除某一行數據時。
語句級觸發器(Statement-Level Trigger)則在執行一條SQL語句時觸發,無論該語句影響了多少行數據。
創建觸發器
SQL> creagte trigger <觸發器名>? [{before | after}]
{[inster | delete | update of 列名列表] }
on 表名
[ referencing <臨時視圖名>]
[ when <觸發條件>]
<觸發動作>
end [觸發器名]
說明:
update: 指明是update觸發器,每當update語句修改由of子句指定的列時,激發觸發器。如果忽略of子句,每當update修改表的任意列值時,都將激發觸發器。
referencing <臨時視圖名>:指定臨時視圖別名,在觸發器運行過程中,系統會生成另個臨時視圖分別存放被更新值舊值和新值(rollback用)。對于行級觸發器,默認臨時視圖名分別為old和new;對于語句級觸發器,默認臨時視圖名分別為old-table和new-table。
例如:
行級觸發器
觸發器中還可以回退修改使用rollback
SQL> create trigger bad_trg after update of balance on users
referencing new row as nrow, old row as orow
for each row
when nrow.balance < 0
begin
rollback
# 插入不良記錄
insert into bads select concat(borrows.userid, convert(varchar(100), getdate(), 10)), borrows.userid, brid, getdate()? from borrows? when nrow.userid = borrows.userid and etime is null
end
語句級觸發器
SQL> create trigger RAISE_LIMIT after update of SAL on EMP
referencing new table as n_tb,? old table as o_tb
for each statement
when (800 > (select avg(SAL) from EMP)
begin
delete from EMP where ENO in ( select ENO from n_tb ) insert into EMP ( select * from o_tb )
end
修改觸發器
SQL> alter? trigger bad_trg??after? update on?users
AS
BEGIN
? ? -- 新的觸發器邏輯
? ? PRINT 'Employee record has been updated.'
? ? -- 可以添加更多的邏輯,例如記錄日志或執行其他操作
END
刪除觸發器
SQL> drop? trigger bad_trg
?