淺談存儲過程和觸發(fā)器
說到存儲過程和觸發(fā)器,其實(shí)在以前做機(jī)房收費(fèi)系統(tǒng)的時(shí)候就接觸到了。但是當(dāng)時(shí)總感覺存儲過程和觸發(fā)器是比較高級的東西,這個(gè)系統(tǒng)不用這些東西也可以。于是就一直沒有好好研究這塊知識。現(xiàn)在看牛腩新聞發(fā)布系統(tǒng),再一次涉及到了這個(gè)東東,這才發(fā)現(xiàn),存儲過程和觸發(fā)器并沒有想象的那么高深莫測。也許有人會說:那是你沒有深入研究。是,我承認(rèn),但個(gè)人覺得目前我們還沒有必要那么深入研究。我們要做的就是:用20%的努力,獲得80%的知識。這樣就基本上可以滿足我們?nèi)粘5男枨罅恕O旅婢秃暧^上說一下存儲過程和觸發(fā)器。
什么是存儲過程呢?官方是這樣定義的,存儲過程(Stored Procedure)是在大型數(shù)據(jù)庫系統(tǒng)中,一組為了完成特定功能的SQL語句集,經(jīng)編譯后存儲在數(shù)據(jù)庫中,用戶通過指定存儲過程的名字并給出參數(shù)(如果該存儲過程帶有參數(shù))來執(zhí)行它。
1、創(chuàng)建存儲過程語句如下:
createprocedure 存儲過程名 @[參數(shù)名] [類型],@[參數(shù)名][類型] as begin 自定義的功能 end |
2、調(diào)用存儲過程
exec sp_name [參數(shù)名]
3、刪除存儲過程
drop proceduresp_name
其實(shí),說白了,存儲過程就是一類特殊的函數(shù),只要我們給它合適的參數(shù)就可以直接調(diào)用,跟調(diào)用API函數(shù)差不多,唯一不同的就是API函數(shù)大部分是別人寫的,而存儲過程我們一般都是自己寫。
注意:不能在一個(gè)存儲過程中刪除另一個(gè)存儲過程,只能調(diào)用另一個(gè)存儲過程。
那么什么是觸發(fā)器呢?嚴(yán)格意思上說,觸發(fā)器就是存儲過程,只不過它的執(zhí)行不是由程序調(diào)用,也不是手工啟動,而是由事件來觸發(fā)。
創(chuàng)建語句如下:
CREATE TRIGGER`<databaseName>`.`<triggerName>` < [ BEFORE |AFTER ] > < [ INSERT | UPDATE | DELETE ] > ON <tableName> FOR EACH ROW BEGIN --do something END | |
這時(shí)有人不解了,什么叫由事件來觸發(fā)呢?其實(shí)這和botton按鈕的點(diǎn)擊事件一樣,只不過觸發(fā)器是由Insert、Update、Delete這些動作觸發(fā),而botton的點(diǎn)擊事件是通過點(diǎn)擊的動作來觸發(fā)的。
那么存儲過程有哪些優(yōu)點(diǎn)呢?
1、速度快。
在運(yùn)行存儲過程前,數(shù)據(jù)庫已對其進(jìn)行了語法和句法分析,并給出了優(yōu)化執(zhí)行方案。也就是說,存儲過程在調(diào)用前就已經(jīng)編譯好了,所以存儲過程能以極快的速度執(zhí)行。
2、存儲過程可以重復(fù)使用,可減少數(shù)據(jù)庫開發(fā)人員的工作量 。
3、保證數(shù)據(jù)的安全性。
通過存儲過程可以使沒有權(quán)限的用戶在控制之下間接地存取數(shù)據(jù)庫,從而保證數(shù)據(jù)的安全。
4、保證數(shù)據(jù)的完整性。
通過存儲過程可以使相關(guān)的動作在一起發(fā)生,從而可以維護(hù)數(shù)據(jù)庫的完整性。
既然存儲過程有如此多的好處,那么我們做項(xiàng)目的時(shí)候是不是用的越多越好呢?答案肯定是NO。萬事都有個(gè)度,存儲過程也一樣。如果在一個(gè)程序系統(tǒng)中大量的使用存儲過程,那么必然會導(dǎo)致它的數(shù)據(jù)結(jié)構(gòu)相當(dāng)復(fù)雜,這樣維護(hù)該系統(tǒng)將會是相當(dāng)困難的一件事。
讓我們合理使用觸發(fā)器和存儲過程,盡情享受他們帶給我們的方便。
posted on 2012-05-14 09:57 順其自然EVO 閱讀(186) 評論(0) 編輯 收藏 所屬分類: 數(shù)據(jù)庫