景偉娜 陳紅軍 段林羽
摘要:數(shù)據(jù)庫應(yīng)用系統(tǒng)對數(shù)據(jù)庫內(nèi)的數(shù)據(jù)要求比較高,要求所設(shè)計的數(shù)據(jù)庫能保證一定程度的數(shù)據(jù)完整性,從而保證有關(guān)聯(lián)數(shù)據(jù)的一致性。本文中以MySQL中的DML觸發(fā)器應(yīng)用在人事管理數(shù)據(jù)庫為例,介紹了如何利用觸發(fā)器實現(xiàn)表與表之間的數(shù)據(jù)一致性。
關(guān)鍵詞:觸發(fā)器;完整性;數(shù)據(jù)一致
一、引言
數(shù)據(jù)庫的完整性是指保護(hù)數(shù)據(jù)庫中數(shù)據(jù)的正確性、有效性和相容性,防止錯誤的數(shù)據(jù)進(jìn)入數(shù)據(jù)庫造成無效操作,本部分內(nèi)容在數(shù)據(jù)庫課程教學(xué)中屬于難點。本文主要介紹作為數(shù)據(jù)完整性實施的方法之一的觸發(fā)器在數(shù)據(jù)庫應(yīng)用中(本文以人事管理應(yīng)用系統(tǒng)為例)的使用以增強本知識塊的掌握。
二、觸發(fā)器介紹
MySQL中的DML觸發(fā)器通過用戶對數(shù)據(jù)庫中表的操作觸發(fā),由于觸發(fā)器是由操作觸發(fā)的過程,因此可以利用觸發(fā)器進(jìn)行維護(hù)表間數(shù)據(jù)的一致性。
創(chuàng)建觸發(fā)器的語法格式如下:
create trigger 觸發(fā)器名
before | after
insert | delete | update
on 表名
for each row
<觸發(fā)體>
觸發(fā)器名即創(chuàng)建的觸發(fā)器的名字;before | after即觸發(fā)時間,在操作前還是操作后觸發(fā);insert | delete | update即對表進(jìn)行的添加、刪除、更新的觸發(fā)操作;表名即在哪個表上進(jìn)行的操作;for each row表示任何記錄執(zhí)行對應(yīng)操作都會觸發(fā)觸發(fā)器;觸發(fā)體里包含了觸發(fā)時要執(zhí)行的SQL語句。
觸發(fā)器將沒有操作之前的狀態(tài)保存到old關(guān)鍵詞:中,將操作后的狀態(tài)保存到new關(guān)鍵詞:中,語法為old/new.字段名。需要注意的是,insert型觸發(fā)器只有new,new 表示將要(插入前)或者已經(jīng)(插入后)增加的數(shù)據(jù);update型觸發(fā)器既有old也有new,old表示更新之前的數(shù)據(jù),new表示更新之后的數(shù)據(jù);delete型觸發(fā)器只有old,old 表示將要(刪除前)或者已經(jīng)(刪除后)被刪除的數(shù)據(jù)。
三、觸發(fā)器在人事管理中的應(yīng)用
1、人事管理數(shù)據(jù)庫介紹
因篇幅所限,本文僅以2個數(shù)據(jù)表中部分字段介紹使用觸發(fā)器實現(xiàn)表間數(shù)據(jù)的一致性。
員工表,包含員工的編號、姓名、部門編號等。部門表,包含部門的編號,名稱等。兩個表的創(chuàng)建語句如下:
create table e (?????????? #員工表
e_no int(6)primary key, #編號
e_name varchar(12),?? #姓名
d_no int(4))?????????? #所在部門編號
create table d(?????????? #部門表
d_no int(4)primary key,#編號
d_name varchar(20))?? #名稱
2、觸發(fā)器在數(shù)據(jù)庫中的應(yīng)用
(1)觸發(fā)器在數(shù)據(jù)添加時示例
delimiter @@
create trigger t_e_i
before insert
on e
for each row
begin
declare m varchar(20);
if new.d_no not in(select d_no from dept)then
select x into m;
end if;
end@@
delimiter ;
MySQL不能在insert觸發(fā)器中對本表直接進(jìn)行insert、update、delete操作,也不能通過回滾事務(wù)取消操作,但如果觸發(fā)器的SQL語句執(zhí)行過程中出現(xiàn)錯誤,會自動撤銷操作,曲線實現(xiàn)事務(wù)回滾。當(dāng)往員工表中添加已存在部門編號的員工信息時,添加成功;添加不存在部門編號的員工信息時,添加失敗。
(2)觸發(fā)器在數(shù)據(jù)更新時示例
create trigger t_d_u
after update
on d
for each row
update e set d_no=new.d_no;
where d_no=old.d_no;
當(dāng)把部門表中部門編號為0801修改為0802時,員工表中部門編號為0801的員工記錄中的部門編號也被修改為0802。
(3)觸發(fā)器在數(shù)據(jù)刪除時示例
create trigger t_d_d
after delete
on d
for each row
delete from e
where d_no=old.d_no;
當(dāng)把部門表中部門編號為0802的部門記錄刪除時,員工表中部門編號為0802的員工記錄也被刪除。
四、總結(jié)
在數(shù)據(jù)庫設(shè)計時為了保持?jǐn)?shù)據(jù)表中數(shù)據(jù)的一致性,可以采用觸發(fā)器作為實現(xiàn)方法之一。通過合理設(shè)計和使用觸發(fā)器,保證數(shù)據(jù)的完整性,以提高數(shù)據(jù)庫的安全性和完整性,但觸發(fā)器操作自動觸發(fā)的特點,也會給后期運行維護(hù)帶來風(fēng)險。
參考文獻(xiàn):
[1]陳志泊.數(shù)據(jù)庫原理及應(yīng)用教程(第4版)[M].北京:人民郵電出版社,2019:276-279.
[2]李月軍 付良延.數(shù)據(jù)庫原理及應(yīng)用(MySQL版)[M].北京:清華大學(xué)出版社,2021:111-113.
[3]陳虹.觸發(fā)器在學(xué)生成績管理數(shù)據(jù)庫中的應(yīng)用研究[J].數(shù)碼設(shè)計,2021(20):85-88.
[4]沈黎.基于網(wǎng)絡(luò)數(shù)據(jù)庫的存儲過程和觸發(fā)器應(yīng)用研究[J].西南師范大學(xué)學(xué)報,2016(41):51-55.
[5]李虎軍.SQL Server觸發(fā)器應(yīng)用探析[J].電腦知識與技術(shù),2016(16):13-15.
作者簡介:
景偉娜(1977-),女,河南襄縣人,碩士,副教授,研究方向:云計算技術(shù)及數(shù)據(jù)分析。
陳紅軍(1971-),男,河南葉縣人,碩士,副教授,研究方向:數(shù)據(jù)庫應(yīng)用。
段林羽(2001-),男,山西呂梁人,本科,計算機科學(xué)與技術(shù)。