李艷杰 曹金靜
摘 要:觸發器在程序設計語言中應用廣泛,特別是在數據庫設計中占有舉足輕重的地位。它具有一觸即發的特點,數據庫中的表通常都是有聯系的,如果一個表中的數據更新,而另一個與它相關聯的表數據不更新,則會使兩個表中的數據不能保持一致,導致數據出現錯誤,而觸發器可以解決這個問題,使所有相關聯的表中的數據保持一致性,本文主要論述觸發器在SQL Server數據庫管理中是如何實現數據一致性的。
關鍵詞:觸發器;程序設計;SQL Server
中圖分類號:TP311.138 文獻標識碼:A 文章編號:2096-4706(2019)04-0030-02
The Application of Trigger in Programming
LI Yanjie,CAO Jinjing
(College of Electronic Information Engineering,Shandong Huayu University of Technology,Dezhou 253034,China)
Abstract:Triggers are widely used in programming languages,especially in database design. It has the characteristics of hair-trigger. The tables in the database are usually related. If the data in one table is updated and the data in the other table is not updated,the data in the two tables will not be consistent,resulting in data errors. Triggers can solve this problem and make the data in all associated tables consistent. This paper mainly discusses how triggers achieve data consistency in SQL Server database management.
Keywords:trigger;program design;SQL Server
0 引 言
在SQL Server數據庫管理中,觸發器是一項非常重要的技術,也是一種特殊的存儲過程,具有一觸即發的特點;它是基于一個表創建的,但是執行時可以操作多個有聯系的表,所以可以對表實施復雜的完整性約束,當與觸發器相關的表中數據發生改變時,觸發器被自動激活,從而防止對數據進行不正確的修改。
1 觸發器的作用
在數據庫中,觸發器能夠實現主鍵和外鍵所不能保證的復雜的參照完整性和數據的一致性。舉例說明:主表為學生表(學號,姓名),主鍵為學號;子表為成績表(學號,成績),外鍵為學號,為兩個表建立完約束之后,則會有如下三條約束:一是子表中存在匹配的記錄,主表中不能刪除此記錄,也不能更改主鍵的值;二是主表中沒有的值,子表中也不能有;三是主表中的記錄可以多于子表。所以,如果學生表刪除(01,王建)這條記錄,數據庫會不允許刪除,因為成績表中存在此學號,但是利用觸發器可以實現兩個表中同時刪除。
2 觸發器的分類
觸發器分兩類:即DML觸發器和DDL觸發器。DML觸發器是當數據庫中發生數據操作語言(DML)事件(即對表中數據進行插入、刪除、更新時)時執行的操作;DDL觸發器是在響應數據定義語言(DDL)事件時執行的操作,DDL觸發器一般用于執行數據庫中的管理任務。例如:對表的創建、修改和刪除,而非表中數據的。下面重點論述DML觸發器。
3 DML觸發器的工作原理
在SQL SERVER里,為每個DML觸發器都定義了兩個特殊的表,一個是插入(INSERTED)表,一個是刪除(DEL ETED)表。這兩個表是存在于數據庫服務器的內存中的,是由系統管理的邏輯表,而不是真正存儲在數據庫中的物理表。INSERTED表對于插入記錄操作來說,INSERTED表里存放的是要插入的數據;對于更新記錄操作來說,INSERTED表里存放的是更新后的記錄。DELETED表對于刪除記錄操作來說,DELETED表里存入的是被刪除的舊記錄;對于更新記錄操作來說,DELETED表里存放的是更新前的記錄。
3.1 DML觸發器的語法結構
DML觸發器的語法結構如下所示:
CREATE TRIGGER 觸發器名稱
ON 表名/視圖名
FOR\AFTER\INSERT OF
UPDATE,INSERT,DELETE
AS
BEGIN
T—SQL 語句
END
3.2 選擇After的應用
其中AFTER(FOR早期版本使用)選項,只能用于基本表,INSTEAD OF選項用于基本表和視圖。當選擇AFTER時,這類觸發器是在記錄已經改變完之后,才會被激活執行,它主要是用于記錄變更后的處理或檢查,一旦發現錯誤,也可以用ROLLBACK TRANSaCTION語句來回滾本次的操作。例:當SQL SERVER接收到一個要執行刪除操作的SQL語句時,SQL SERVER先將要刪除的記錄存放在刪除表里,然后把數據表里的記錄刪除,再激活AFTER觸發器,執行AFTER觸發器里的T—SQL語句。執行完畢之后,刪除內存中的刪除表,退出整個操作。
案例說明:在電子商務數據庫中創建一個DML觸發器,實現在用戶信息表中刪除用戶時,顯示“某某用戶已被刪除”。
CREATE TRIGGERT1
ON USERS \\USERS為表的名稱
AFTER DELETE \\此處選擇DELETE
AS
BEGIN
DECLARE @A VARCHAR(30) \\聲明一個變量
SELECT @A=U_NAMEFROM DELETED
PRINT @A+'用戶已被刪除'
END
代碼完成之后,當刪除USERS表中的一條記錄時,便會顯示此用戶已被刪除的結果。
3.3 選擇INSTEAD OF的應用
一個表中只能建立一個INSTEAD OF觸發器,而AFTER可以建立多個。INSTEAD OF觸發器,是在插入、更新、刪除操作運行之前激活,不再去執行原來的SQL操作,而去運行觸發器本身的SQL語句,而AFTER觸發器,即在記錄被更改或刪除之后才被觸發。
案例說明:創建觸發器,要求不能刪除電子商務數據庫中訂單表中的訂單記錄。
CREATE TRIGGERT2
ON ORDERS
INSTEAD OF DELETE
AS
PRINT '訂單不能被刪除'
當執行語句刪除訂單表中的記錄時,會彈出“訂單不能被刪除”。
4 綜合案例實現
建立兩個表,表一:XUESHENG(XUEHAO CHAR(6), XINGM CHAR(10)),輸入記錄為:(11,WANGLING,(12, LIMING),表二:CHENGJI(XUEHAO CHAR(6),CH EN GJIFLOAT),輸入記錄為:(11,80),(12,60)。
根據兩個表建立觸發器,要求當在CHENGJI表中插入記錄時,如果學號不在XUESHENG表中,則提示信息:此學生不存在,不能插入成績,并加以驗證;當在CHENGJI表中插入(13,90)這條記錄時,提示信息不能插入。
CREATE TRIGGER T3
ONCHENGJI
AFTER INSERT
AS
BEGIN
DECLARE @A CHAR(6)
SELECT @A=XUESHENG.XUEHAO
FROMXUESHENG,INSERTED
WHEREXUESHENG.XUEHAO=INSERTED.XUEHAO
IF @AIS NULL
BEGIN
ROLLBACK TRANSaCTION
PRINT '插入不成功,此學生不存在'
END
END
通過下面的插入語句驗證觸發器的執行:
INSERTINTOCHENGJI VALUES(13,90)
執行此語句時,會提示插入不成功,此學生不存在。因為此學生的學號在XUESHENG表中不存在,說明沒有學生存在,更不會有學生成績,也就不允許插入此記錄,所以通過觸發器可以讓多個表中的數據保持一致。
5 結 論
本文介紹了觸發器的含義、作用、分類、語法結構,以及對DML觸發器語法結構中關鍵字的解釋,并舉例編寫代碼說明觸發器實現的過程,由此可見,對于多個表而言,若想實現程序設計中數據的參照完整性和數據的一致性,必須建立觸發器來解決,并且要注意是在已經建好的表上建立觸發器,還是在數據庫上建立觸發器,級別不同,選擇的關鍵字也不同,實現的功能也不同。
參考文獻:
[1] 劉丹,李楠.SQL Server觸發器探析 [J].信息與電腦(理論版),2015(15):105-106+111.
[2] 邱吉苗,竺東杰,方飛波,等.基于醫囑觸發器技術的藥品不良反應監測研究 [J].中國數字醫學,2016,11(9):56-57.
[3] 張海越,范曦.觸發器在SQL Server數據庫中使用的分析與研究 [J].數字技術與應用,2016(2):77.
[4] 陳雅.SQL Server數據庫中觸發器的應用研究 [J].電腦知識與技術,2017,13(12):1-2+12.
[5] 何勰緋.探析觸發器在大型數據庫中的應用 [J].中國信息化,2018(11):48-49.
作者簡介:李艷杰(1978-),女,漢族,山東德州人,講師,碩士,主要研究方向:數據挖掘技術;曹金靜(1983-),女,漢族,山東德州人,教師,講師,碩士,研究方向:電子信息、軟件開發。