數據庫:儲存過程與觸發器

儲存過程:

存儲過程是存儲在數據庫目錄中的一段聲明性SQL語句。 存儲過程是數據庫中的一個重要對象,用戶經過指定存儲過程的名字並給出參數來執行它。java

存儲過程的優勢:sql

① 加強了SQL語句的功能和靈活性;
② 不須要反覆創建一系列處理步驟,保證了數據的完整性;
③ 下降了網絡的通訊量,客戶端調用存儲過程只須要傳存儲過程名和相關參數便可,與傳輸SQL語 句相比天然數據量少了不少;
④ 加強了使用的安全性,經過存儲過程可使沒有權限的用戶在控制之下間接地存取數據庫,從而 保證數據的安全;
⑤ 能夠實現集中控制,當規則發生改變時,只須要修改存儲過程就能夠啦;數據庫

存儲過程的缺點:緩存

① 調試不是很方便
② 可能沒有建立存儲過程的權利
③ 從新編譯問題
④ 移植性問題安全

存儲過程的分類:服務器

1)系統存儲過程:
以sp_開頭,用來進行系統的各項設定.取得信息.相關管理工做。網絡

2)本地存儲過程:
用戶建立的存儲過程是由用戶建立並完成某一特定功能的存儲過程,事實上通常所說的存儲過程就是指本地存儲過程。分佈式

3)臨時存儲過程:函數

①局部臨時存儲過程
以井字號(#)做爲其名稱的第一個字符,則該存儲過程將成爲一個存放在tempdb數據庫中的本地臨時存儲過程,且只有建立它的用戶才能執行它;學習

②全局臨時存儲過程
以兩個井字號(##)號開始,則該存儲過程將成爲一個存儲在tempdb數據庫中的全局臨時存儲過程,全局臨時存儲過程一旦建立,之後鏈接到服務器的任意用戶均可以執行它,並且不須要特定的權限。

4)遠程存儲過程:
在SQL Server2005中,遠程存儲過程(Remote Stored Procedures)是位於遠程服務器上的存儲過程,一般可使用分佈式查詢和EXECUTE命令執行一個遠程存儲過程。

5)擴展存儲過程:
擴展存儲過程(Extended Stored Procedures)是用戶可使用外部程序語言編寫的存儲過程,並且擴展存儲過程的名稱一般以xp_開頭

建立存儲過程的參數:

procedure_name :存儲過程的名稱,在前面加#爲局部臨時存儲過程,加##爲全局臨時存儲過程。

number:是可選的整數,用來對同名的過程分組,以便用一條 DROP PROCEDURE 語句便可將同組的過程一塊兒除去。

parameter:存儲過程的參數。能夠有一個或多個。用戶必須在執行過程時提供每一個所聲明參數的值(除非定義了該參數的默認值)。

data_type:參數的數據類型。全部數據類型(包括 text、ntext 和 image)都可以用做存儲過程的參數。

VARYING: 指定做爲輸出參數支持的結果集(由存儲過程動態構造,內容能夠變化)。僅適用於遊標參數。

default: 參數的默認值。若是定義了默認值,沒必要指定該參數的值便可執行過程。默認值必須是常量或 NULL。

OUTPUT :代表參數是返回參數。

RECOMPILE:代表 SQL Server 不會緩存該過程的計劃,該過程將在運行時從新編譯。

ENCRYPTION:表示 SQL Server 加密 。

FOR REPLICATION :指定不能在訂閱服務器上執行爲複製建立的存儲過程。

AS :指定過程要執行的操做。

sql_statement :過程當中要包含的任意數目和類型的 Transact-SQL 語句。但有一些限制。

調用存儲過程:

1)建立存儲過程:

Create PROCEDURE 儲存過程名稱 (參數列表)
begin
 過程體
end;

例:

建立儲存過程:

create procedure porcedureName () 
begin 
 select name from user; 
end;  

2)調用存儲過程:

call 儲存過程名稱

例:

call porcedureName();

3)刪除儲存過程:

DROP PROCEDURE 儲存過程名稱

觸發器:

觸發器是用戶定義在關係表上的一類由事件驅動的特殊的存儲過程。觸發器是指一段代碼,當觸發某個事件時,自動執行這些代碼。

觸發器做用:

(1) 強化約束(Enforce restriction)
可以實現比CHECK 語句更爲複雜的約束。

(2) 跟蹤變化(Auditing changes)
能夠偵測數據庫內的操做,從而不容許數據庫中未經許可的指定更新和變化。

(3) 級聯運行(Cascaded operation)
能夠偵測數據庫內的操做,並自動地級聯影響整個數據庫的各項內容。例如,某個表上的觸發器中包含有對另一個表的數據操做(如刪除,更新,插入)而該操做又致使該表上觸發器被觸發。

(4) 存儲過程的調用(Stored procedure invocation)
爲了響應數據庫更新,觸發器能夠調用一個或多個存儲過程,甚至能夠經過外部過程的調用而在DBMS(數據庫管理系統)自己以外進行操做。

觸發器的限制:

1)觸發程序不能調用將數據返回客戶端的存儲程序,也不能使用採用CALL語句的動態SQL語句,可是容許存儲程序經過參數將數據返回觸發程序,也就是存儲過程或者函數經過OUT或者INOUT類型的參數將數據返回觸發器是能夠的,可是不能調用直接返回數據的過程;
2)不能再觸發器中使用以顯示或隱式方式開始或結束事務的語句;

建立觸發器:

(1)建立只有一條執行語句的觸發器

  語法結構以下:

CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW trigger_stmt

trigger_name:用戶自定義的觸發器名稱;
trigger_time:標識觸發事件,能夠指定爲before(時間發生前執行)或after(事件發生後執行);
trigger_event:標識觸發事件,包括INSERT、UPDATE、DELETE;
table_name:觸發器創建在哪一個表上;
trigger_stmt:觸發器執行語句。

(2)建立有多個執行語句的觸發器

語法結構以下:

CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW
BEGIN
 語句執行列表
END

【當觸發器有至少一條的執行語句時,多條執行語句須要用BEGIN和END包裹,分別表示整個代碼塊的開始和結束。】

查看觸發器:

show triggers;

刪除觸發器:

DROP TRIGGER [schema_name] trigger_name;

【schema_name:表示數據庫名稱,可選參數,若是省略則表示從當前數據庫中刪除觸發器。】

謝謝你們閱讀,若是想要獲取更多java基礎知識,能夠戳我一塊兒交流學習!

相關文章
相關標籤/搜索