1、實現數據完整性的手段
在sqlserver中,在服務器端實現數據完整性主要有兩種手段:一種是在創建表時定義數據完整性,主要分為:實體完整性、域完整性、和級聯參照完整性;實現的手段是創建主鍵約束、唯一鍵約束、檢查約束、默認值約束和各種級聯完整性約束。另一種是通過編寫觸發器語句來實現,通過定義觸發條件和編寫觸發后執行語句,來實現對數據表操作的各種約束。
2、觸發器的概念
觸發器是一種特殊的存儲過程。通常用於實現強制業務規則和數據完整性。觸發器是通過事件觸發而由系統自動執行。主要體現在它在插入、刪除或修改指定表中的數據時自動觸發執行,以保持數據完整性、檢查數據有效性、實現數據庫管理任務和相關功能。
3、 觸發器的工作原理
SQLServer為每個觸發器都創建了兩個專用的臨時表:INSERTED表和DELETED表。這兩個表的結構與激發觸發器的表的結構相同。這兩個表為只讀表,用戶不能對它們進行修改,只能在創建觸發器的程序中查詢表中的內容。
當執行INSERT語句時,INSERTED語句表存放着將要向表中插入的所有行。當執行DELETE語句時,DELETED表存放要將要從表中刪除的所有行。當執行UPDATE語句時,相當於先執行一個DELETE操作,再執行一個INSERT操作,所以舊的行被移動到DELETED表中,而新的行插入到INSERTED表中。
這兩個表會隨着觸發器的執行完畢而刪除。
觸發器分為兩種觸發方式:INSTEAD OF觸發和AFTER觸發。
其中,INSTEAD OF觸發是替代觸發:是指如果有SQL語句觸發了某一個觸發器,則會執行觸發器中事先定義好的語句,而不執行該SQL語句。AFTER觸發是后觸發:是指如果有一段SQL語句觸發了某一個觸發器,則並不立刻執行該觸發器中事先定義好的語句,而是等待該SQL語句中所有指定的操作都已成功執行后,才激發該觸發器。
4、觸發器與數據表約束的區別
1)可以引用其它表的字段。觸發器可以引用其他表,可以包含復雜的SQL語句。當對一個表進行修改時,通過觸發器按照相關業務規則去修改其他的表,一旦發現修改過程中出現違背業務規則的情況,可以通過回滾語句,將數據恢復到修改前的狀態。
2)可及時對比數據修改前后的差別。因為觸發器中INSERTED和DELETED臨時表的存在,用戶可以對操作前后的數據進行比較,從而更加明確數據表更新前后的變化狀況。
5、 創建SQL觸發器語句
使用CREATE TRIGGER命令創建觸發器的基本語法格式如下。
CREATE TRIGGER 觸發器名 ON 表名| 視圖名
FOR INSERT | UPDATE |DELETED
AFTER | INSTEAD OF
AS
SQL語句
6、使用觸發器實現數據完整性的實例
現有銷售管理數據庫“Marketing”,有以下主要數據表。
訂單信息(訂單號,銷售工號,貨品編碼,客戶編號,數量,總金額)
貨品信息(編碼,名稱,庫存量,供應商編碼,狀態,售價,成本價)
銷售人員(工號,部門號,姓名,性別,電話地址)
(1)創建插入觸發器實例
在“銷售人員” 表中,建立一個插入觸發器:check_部門號,當用戶向銷售人員表中插入一個新的銷售人員時,如果該銷售人員的部門號在部門信息表中根本不存在,則無法完成操作。語句如下:
Create trigger check_部門號 on 銷售人員
for insert
as
declare @bmh int
select @bmh=部門號 from inserted
if @bmh not in(select 編號 from 部門信息)
begin raiserror(‘沒有此部門!’,7,1)
rollback transaction
End
建立觸發器后,當用戶輸入一個錯誤銷售人員的信息(該職員的部門號不存在),則無法完成插入功能。
(2)創建刪除觸發器實例
當用戶從“訂單信息”表中刪除一個訂單時,表示用戶退單,即不再訂購該貨品。在這種情況下,我們應該將“貨品信息”中的庫存量及時補上,用刪除觸發器完成此操作。
Create trigger add_庫存量 on 訂單信息
for delete
as
declare @sl int,@hpbm int
select @sl=數量,@hpbm=貨品編碼 from deleted
update 貨品信息 set 庫存量=庫存量+@sl where 編碼=@hpbm
(3)創建更新觸發器
對‘銷售人員’表繼續建立一個 更新觸發器:update_姓名,當銷售人員的名字發生改動時,其改動的名字可以在“培訓”表中體現出來。
Create trigger check_姓名
on 銷售人員
for update
as
if update(姓名)
begin
declare @xm char(8),@gh int
select @xm=姓名,@gh=工號 from inserted
update 培訓 set 姓名=@xm where 工號=@gh
end
go
7、 結束語
綜上所述,觸發器是由對數據的操作自動引發執行的代碼。觸發器可以完成約束所無法實現的。觸發器的主要好處在於它可以包含使用SOL代碼的復雜處理邏輯。無論是對於維護數據庫表間的一致性。保持數據的相關完整性,還是執行強制實施業務規則,觸發器都能幫助用戶實現。掌握開發觸發器的技術。編寫出高效率的觸發器。將會使數據庫的設計變得簡潔和高效。