數(shù)據(jù)庫(kù)觸發(fā)器Trigger詳解
在數(shù)據(jù)庫(kù)管理系統(tǒng)中,觸發(fā)器(Trigger)是一種特殊的存儲(chǔ)過(guò)程,它在特定的事件發(fā)生時(shí)自動(dòng)執(zhí)行。觸發(fā)器通常用于維護(hù)數(shù)據(jù)的完整性和一致性。通過(guò)事件觸發(fā)而被執(zhí)行,不能直接調(diào)用。
觸發(fā)器的三要素
觸發(fā)事件 before/after(insert、update、delete)
觸發(fā)條件 when
觸發(fā)動(dòng)作 begin ... end
觸發(fā)器的分類
根據(jù)觸發(fā)時(shí)機(jī)和觸發(fā)事件的不同,觸發(fā)器可以分為以下幾種類型:行級(jí)觸發(fā)器與語(yǔ)句級(jí)觸發(fā)器
行級(jí)觸發(fā)器(Row-Level Trigger)在每一行數(shù)據(jù)受到影響時(shí)觸發(fā),例如在插入、更新或刪除某一行數(shù)據(jù)時(shí)。
語(yǔ)句級(jí)觸發(fā)器(Statement-Level Trigger)則在執(zhí)行一條SQL語(yǔ)句時(shí)觸發(fā),無(wú)論該語(yǔ)句影響了多少行數(shù)據(jù)。
創(chuàng)建觸發(fā)器
SQL> creagte trigger <觸發(fā)器名> [{before | after}]
{[inster | delete | update of 列名列表] }
on 表名
[ referencing <臨時(shí)視圖名>]
[ when <觸發(fā)條件>]
<觸發(fā)動(dòng)作>
end [觸發(fā)器名]說(shuō)明:
update: 指明是update觸發(fā)器,每當(dāng)update語(yǔ)句修改由of子句指定的列時(shí),激發(fā)觸發(fā)器。如果忽略of子句,每當(dāng)update修改表的任意列值時(shí),都將激發(fā)觸發(fā)器。
referencing <臨時(shí)視圖名>:指定臨時(shí)視圖別名,在觸發(fā)器運(yùn)行過(guò)程中,系統(tǒng)會(huì)生成另個(gè)臨時(shí)視圖分別存放被更新值舊值和新值(rollback用)。對(duì)于行級(jí)觸發(fā)器,默認(rèn)臨時(shí)視圖名分別為old和new;對(duì)于語(yǔ)句級(jí)觸發(fā)器,默認(rèn)臨時(shí)視圖名分別為old-table和new-table。
例如:
行級(jí)觸發(fā)器
觸發(fā)器中還可以回退修改使用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
語(yǔ)句級(jí)觸發(fā)器
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
修改觸發(fā)器
SQL> alter trigger bad_trg after update on users
AS
BEGIN
-- 新的觸發(fā)器邏輯
PRINT 'Employee record has been updated.'
-- 可以添加更多的邏輯,例如記錄日志或執(zhí)行其他操作
END刪除觸發(fā)器
SQL> drop trigger bad_trg
到此這篇關(guān)于數(shù)據(jù)庫(kù)觸發(fā)器Trigger的文章就介紹到這了,更多相關(guān)數(shù)據(jù)庫(kù)觸發(fā)器Trigger內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
談?wù)剶?shù)據(jù)庫(kù)的字段設(shè)計(jì)的幾個(gè)心得
今天小編就為大家分享一篇關(guān)于談?wù)剶?shù)據(jù)庫(kù)的字段設(shè)計(jì)的幾個(gè)心得,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03
數(shù)據(jù)庫(kù) 左連接 右連接 全連接用法小結(jié)
在關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)中,表建立時(shí)各數(shù)據(jù)之間的關(guān)系不必確定,常把一個(gè)實(shí)體的所有信息存放在一個(gè)表中。2008-08-08
海量數(shù)據(jù)庫(kù)的查詢優(yōu)化及分頁(yè)算法方案 2 之 改良SQL語(yǔ)句
海量數(shù)據(jù)庫(kù)的查詢優(yōu)化及分頁(yè)算法方案 2 之 改良SQL語(yǔ)句...2007-03-03
Access與sql server的語(yǔ)法區(qū)別總結(jié)
這篇文章主要介紹了Access與sql server的語(yǔ)法區(qū)別總結(jié),需要的朋友可以參考下2007-03-03
深入解析NoSQL數(shù)據(jù)庫(kù)的分布式算法(圖文詳解)
這篇文章主要介紹了深入解析NoSQL數(shù)據(jù)庫(kù)的分布式算法,需要的朋友可以參考下2015-12-12
只有兩個(gè)字段用一個(gè)sql語(yǔ)句查詢出某個(gè)學(xué)生的姓名、成績(jī)以及在表中的排名
這篇文章主要介紹了只有兩個(gè)字段用一個(gè)sql語(yǔ)句查詢出某個(gè)學(xué)生的姓名、成績(jī)以及在表中的排名,需要的朋友可以參考下2014-08-08
使用Navicat生成ER關(guān)系圖并導(dǎo)出的方法
這篇文章主要介紹了使用Navicat生成ER關(guān)系圖并導(dǎo)出的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
mysql "group by"與"order by"的研究--分類中最新的內(nèi)容
這兩天讓一個(gè)數(shù)據(jù)查詢難了。主要是對(duì)group by 理解的不夠深入。才出現(xiàn)這樣的情況2010-06-06

