儲存過程vs觸發器

2021-04-13 11:02:26 字數 4783 閱讀 2553

編寫儲存過程與觸發器

儲存過程和觸發器是由使用者建立的、駐留在伺服器的一組transact sql查詢語句。觸發器是系統在特定條件下執行的。儲存過程能夠改善應用程式的效能。當客戶程式需要訪問資料時,一般要經過5個步驟才能訪問到資料:

1)  查詢語句被傳送到伺服器。

2)  伺服器編譯sql**。

3)  優化產生查詢的執行計畫。

4)  資料引擎執行查詢。

5)  結果發回客戶程式。

儲存過程是在建立時編譯的,當儲存過程第一次執行時,sql server產生查詢執行計畫並將其儲存進來,以利於將來使用。當通過儲存過程發出乙個請求時,上述的第2和第3步就沒有了,這能大大改善系統的效能。即使在第1步上也能提高效能。因為此時傳送到伺服器的語句只是一條儲存過程的execute語句,而不是龐大的、複雜的查詢。這種特性能降低網路的流量。

除了效能方面的改善外,儲存過程還提供了方便地集中維護應用程式的功能。如果將查詢嵌入到應用程式中。而又需要對查詢進行改變,則應用程式需要重新編譯,並重新發布到所有的客戶端。而在儲存過程中,修改對使用者而言是透明的,它只需要在伺服器上重新編譯儲存過程。

儲存過程還能提供安全機制,儘管使用者可能無權執行儲存過程中的命令,但它卻可能有權執行儲存過程本身。有時候,系統管理員不會給使用者以資料修改(update、insert和delete)的權力。建立的儲存過程卻能進行這些操作。當然使用者需要擁有執行該儲存過程的權力。

建立儲存過程

儲存過程可以達到以下目的:

· 帶引數。

· 返回狀態值。

· 呼叫其它儲存過程。

· 在遠端伺服器上執行。

儲存過程在「sysobjects」系統表中有乙個表項,其型別為「p」。儲存過程的文字儲存在「syscomments」系統表中。建立儲存過程需要使用transact sql命令create procedure。

例如:use pubs go

create procedure ap_getauthorsforpublisher as

select a.au_lname,a.au_fname

from authors a, titleauthor ta, titles t, publishers p

where a.au_id = ta.au_id

and ta.title_id = t.title_id

and t.pub_id = p.pub_id

and p.pub_name = 』new moon books』 go

create procedure語句的語法如下:

create proc[dure] procedure_name [;number]

[@parameter_name ][output] [,_n] ]

[with ]

[for replication] as

number是用來對相同名字的過程進行分組的整數。分組是將所有的過程通過drop procedure語句組合到乙個分組中。

@parameter_name指定引數的名稱。

recompile表示每次執行過程時都要進行編譯。

encryption表示過程的文字在「syscomments」表中要加密。

for replication表示過程不能在提交伺服器上執行。

將引數傳遞給儲存過程

儲存過程能夠接受引數。

注意:過程的引數也可以是使用者定義的資料型別。

給引數乙個預設值

使用者還可以為儲存過程中的引數定義預設值。當在執行時沒有提供所需的引數時,系統就使用預設值作為引數。如果既沒有定義預設值,又沒有在執行時提供引數,則sql server就會返回乙個錯誤。在儲存過程中定義預設值,並使用一些邏輯檢測是否指定了引數從而採取相應的行動,這是一種很好的習慣。

例如:use pubs go

create procedure ap_getauthorsforpublisher

@publishername varchar(40) = 『new moon books』 as

select a.au_lname,a.au_fname

from authors a, titleauthor ta, titles t, publishers p

where a.au_id = ta.au_id

and ta.title_id = t.title_id

and t.pub_id = p.pub_id

and p.pub_name = @publishername

go 大多關係型資料庫系統:如oracle、sybase、db2等均支援對資料庫觸發器(data   base   triggers)的使用。觸發器是一種特殊型別的存貯過程,它在插入、刪除或修改特定表中資料時起作用。觸發器通過維持不同表中邏輯上相關資料的一致性,保持資料的相關完整性。  

觸發器的主要特點在於,不管何種原因造成資料變化,它均能夠自動響應。因此,與存貯過程相類似,在當今資料庫系統的建立中,系統開發人員大多使用觸發器,極大推進了系統建立的質量。本文以oracle公司的oracle   7資料庫系統所支援的觸發器為例,就觸發器的建立、組成、使用作一介紹。  

1   觸發器的建立及使用時機  

當針對某特定表的insert,update或delete語句執行時,使用者所定義的過程被隱含執行,這個過程就叫做資料庫觸發器。觸發器可以作為乙個單元而執行的sql及pl/sql語句,並可呼叫存貯過程,但存貯過程與觸發器在被執行的方式上完全不同。存貯過程是被使用者應用觸發器顯式呼叫的,而觸發器則是當insert,update或delete語句執行時,由資料庫系統點火的(fired),不管與其相連的使用者及應用程式。觸發器被存貯於資料庫中,並與相關聯的表分離,由於一般應用預先定義了觸發器,相應的資料庫管理系統對其進行了偽編譯及優化,因而在客戶/伺服器計算模式下,對減輕網路流量及加快執行速度方面,是一較好的方案。  

觸發器僅可定義於表上,而不能定義於檢視上,在大多數情況下,觸發器用於如下幾個方面:  

1)   自動生成派生列值;2)   禁止非法事務;3)   增強複雜的安全識別;4)   在分布式資料庫中增強參照完整性;5)   增強複雜的商業規則;6)   提供透明的事件日誌;7)   提供高階審計;8)   維護同步表複製;9)   在表訪問上聚合統計。  

開發人員一般是對上述9種情況作組合使用,可歸為以下四種典型應用。  

2)   實現那些破壞完整性操作的拒絕,如:不匹配外鍵值的插入拒絕;  

3)   實現庫定義本身所不能實現的更為複雜的商業規則,如:更新操作的時間限制,更新資料的幅度限制等;  

4)   實現簡單的「如果……怎麼辦」的分析。  

在觸發器的使用中,需注意避免級聯點火的問題,另一方面,對觸發器的過度使用會導致維護困難,還需注意觸發器級定義完整性約束的區別。  

2   觸發器的組成  

觸發器,由觸發事件或語句、觸發器限制、觸發體三部分組成,如下列所示:  

能導致觸發器點火的sql語句叫做觸發事件或語句,它可以是在一表上的insert,update或delete語句,也可以是多個dml語句,如:……insert   or   delete   of   inventory……。  

當多個型別dml語句點火觸發器時,條件前置可用來檢測觸發語句的型別,因而,單一的觸發器內可據點火觸發器主句型別來執行不同的處理。  

觸發器限制指明一布林型(邏輯)表示式,僅當表示式值為真(true)時,觸發器才點火,否則觸發體將不被執行。  

觸發體是乙個過程(pl/sql塊),它由一些sql及pl/sql語句**組成,觸發語句被執行,且觸發器限制為真時,該段**被執行。  

與存貯過程類似,觸發體內含sql及pl/sql語句,並可定義pl/sql語言結構,可指明觸發體、執行的次數。  

行觸發器對所影響的每行執行一次。如-update語句涉及到某錶的多行更新,則對更新的每一行,觸發器點火一次;而語句觸發器僅點火一次,不管其語句影響到表的多少行;如-delete語句刪除了表中的多行,但語句觸發器僅點火一次。  

在定義觸發器時,還可指明觸發時間,即觸發體在觸發語句之前或之後執行:before、after。  

在觸發器的實際應用中,往往是組合觸發時間及觸發次數,由這些引數可形成如下表所示的四種型別的觸發器。    

類   型  

含   義  

觸發時間  

觸發次數  

before  

statement  

在執行觸發語句前,執行觸發體  

after  

statement  

在執行觸發語句及申請任何滯後完全性約束之後,執行觸發體  

before  

row  

在修改所影響的每一行及驗證相應完整性約束之前,執行觸發體  

after  

row  

在修改所影響的每一行及可能申請相應完整性約束之後,執行觸發體,設觸發器實行行級封鎖機制。  

對一給定表,可以有同一型別的多個觸發器。更進一步,對每種型別的dml語句(insert,update或delete)亦可建立任意多的字首型別不同的觸發器,針對同一語句的相同型別的觸發器,其點火次序是隨機的(不能實現程式控制)。  

3   觸發器的執行  

定義於資料庫的觸發器,可由程式控制其使能(enable)或遮蔽(disable)狀態。  

單一的-sql語句可以潛在地點火前述四種型別的觸發器,另一方面,觸發體內的一語句可能導致乙個或多個完整性規則,也可能導致其它的觸發器點火(級聯觸發器),關於多觸發點火次序及約束檢測,oracle採用以下的執行模型。  

1)   執行所有的before語句級觸發器;2)   對遍歷所涉及的每一行:a.執行所有的before行級觸發器;b.鎖定並修改行,執行完整性約束檢測;c.執行所有的after行級觸發器。3)   完成滯後完整性的約束檢測;4)   執行所有的after語句級觸發器。  

觸發器 儲存過程

1 為productsales資料庫中的產品表建立乙個名為update pno的update觸發器,該觸發器的作用是禁止更新產品表中的 productname 欄位的內容。並用update語句修改產品表中第一條記錄為 1 hp1500 印表機 2000 要求顯示 不能修改產品名稱 的警告資訊。cre...

儲存過程 觸發器

觸發器主要是通過事件進行觸發而被執行的,而儲存過程可以通過儲存過程名字而被直接呼叫。當對某一表進行諸如update insert delete 這些操作時,就會自動執行觸發器所定義的sql 語句,從而確保對資料的處理必須符合由這些sql 語句所定義的規則。觸發器的主要作用就是其能夠實現由主鍵和外來鍵...

sql 觸發器 儲存過程 觸發器(3 3)

1 what?什麼是觸發器 trigger 前兩篇介紹了儲存過程,儲存過程可以理解為sql語句集。那麼觸發器就是一種特殊的儲存過程,也就是一群特殊的sql語句集。特殊在哪?從上文得知,儲存過程是依賴名字才被呼叫的。不僅是儲存過程,我們常用的方法等,大部分也是先知道名字,才能去使用。就像吃飯採用訂外賣...