最簡單的意思就是在sql server中定義了一系列操作的的一個過程,只要調用他就可以完成相應的操作.
===========================================================
存儲過程定義:
將常用的或很復雜的工作,預先用SQL語句寫好並用一個指定的名稱存儲起來, 那麼以後要叫數據庫提供與已定義好的存儲過程的功能相同的服務時,只需調用execute,即可自動完成命令。
那麼存儲過程與一般的SQL語句有什麼區別呢?
存儲過程的優點:
1.存儲過程只在創造時進行編譯,以後每次執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高數據庫執行速度。
2.當對數據庫進行復雜操作時(如對多個表進行Update,Insert,Query,Delete時),可將此復雜操作用存儲過程封裝起來與數據庫提供的事務處理結合一起使用。
3.存儲過程可以重復使用,可減少數據庫開發人員的工作量 。
4.安全性高,可設定只有某此用戶才具有對指定存儲過程的使用權。
存儲過程的種類:
1.系統存儲過程:以sp_開頭,用來進行系統的各項設定.取得信息.相關管理工作,
如 sp_help就是取得指定對象的相關信息
2.擴展存儲過程 以XP_開頭,用來調用操作系統提供的功能
exec master..xp_cmdshell 'ping 10.8.16.1'
3.用戶自定義的存儲過程,這是我們所指的存儲過程
===========================================================
觸發器(trigger)是個特殊的存儲過程,它的執行不是由程序調用,也不是手工啟動,而是由個事件來觸發,比如當對一個表進行操作(
insert,delete, update)時就會激活它執行。觸發器經常用於加強數據的完整性約束和業務規則等。 觸發器可以從
DBA_TRIGGERS ,USER_TRIGGERS 數據字典中查到。
觸發器可以查詢其他表,而且可以包含復雜的 SQL 語句。它們主要用於強制服從復雜的業務規則或要求。例如:您可以根據客戶當前的帳戶狀態,控制是否允許插入新訂單。
觸發器也可用於強制引用完整性,以便在多個表中添加、更新或刪除行時,保留在這些表之間所定義的關系。然而,強制引用完整性的最好方法是在相關表中定義主鍵和外鍵約束。如果使用數據庫關系圖,則可以在表之間創建關系以自動創建外鍵約束。
創建觸發器的SQL語法
DELIMITER |
CREATE TRIGGER ``.``
ON
FOR EACH ROW
BEGIN
--do something
END |
觸發器的優點
觸發器可通過數據庫中的相關表實現級聯更改;不過,通過級聯引用完整性約束可以更有效地執行這些更改。觸發器可以強制比用 CHECK
約束定義的約束更為復雜的約束。與 CHECK 約束不同,觸發器可以引用其它表中的列。例如,觸發器可以使用另一個表中的 SELECT
比較插入或更新的數據,以及執行其它操作,如修改數據或顯示用戶定義錯誤信息。觸發器也可以評估數據修改前後的表狀態,並根據其差異采取對策。一個表中的多個同類觸發器(INSERT、UPDATE
或 DELETE)允許采取多個不同的對策以響應同一個修改語句。
比較觸發器與約束
約束和觸發器在特殊情況下各有優勢。觸發器的主要好處在於它們可以包含使用 Transact-SQL
代碼的復雜處理邏輯。因此,觸發器可以支持約束的所有功能;但它在所給出的功能上並不總是最好的方法。實體完整性總應在最低級別上通過索引進行強制,這些索引或是
PRIMARY KEY 和 UNIQUE 約束的一部分,或是在約束之外獨立創建的。假設功能可以滿足應用程序的功能需求,域完整性應通過
CHECK 約束進行強制,而引用完整性 (RI) 則應通過 FOREIGN KEY
約束進行強制。在約束所支持的功能無法滿足應用程序的功能要求時,觸發器就極為有用。
例如:除非 REFERENCES 子句定義了級聯引用操作,否則 FOREIGN KEY 約束只能以與另一列中的值完全匹配的值來驗證列值。
CHECK 約束只能根據邏輯表達式或同一表中的另一列來驗證列值。如果應用程序要求根據另一個表中的列驗證列值,則必須使用觸發器。
約束只能通過標准的系統錯誤信息傳遞錯誤信息。如果應用程序要求使用(或能從中獲益)自定義信息和較為復雜的錯誤處理,則必須使用觸發器。
觸發器可通過數據庫中的相關表實現級聯更改;不過,通過級聯引用完整性約束可以更有效地執行這些更改。
觸發器可以禁止或回滾違反引用完整性的更改,從而取消所嘗試的數據修改。當更改外鍵且新值與主鍵不匹配時,此類觸發器就可能發生作用。例如,可以在
titleauthor.title_id 上創建一個插入觸發器,使它在新值與 titles.title_id
中的某個值不匹配時回滾一個插入。不過,通常使用 FOREIGN KEY 來達到這個目的。
如果觸發器表上存在約束,則在 INSTEAD OF 觸發器執行後但在 AFTER 觸發器執行前檢查這些約束。如果約束破壞,則回滾 INSTEAD OF 觸發器操作並且不執行 AFTER 觸發器。
觸發器到底可不可以在視圖上創建 在 SQL Server™ 聯機叢書中,是沒有說觸發器不能在視圖上創建的, 並且在語法解釋中表明:
在 CREATE TRIGGER 的 ON 之後可以是視圖。
然而,事實似乎並不是如此,很多專家也說觸發器不能在視圖上創建。我也專門作了測試,的確如此,不管是普通視圖還是索引視圖,都無法在上面創建觸發器,真的是這樣嗎?請點擊詳細,但是無可厚非的是:當在臨時表或系統表上創建觸發器時會遭到拒絕。
深刻理解 FOR CREATE TRIGGER 語句的 FOR 關鍵字之後可以跟 INSERT、UPDATE、DELETE
中的一個或多個,也就是說在其它情況下是不會觸發觸發器的, 包括
SELECT、TRUNCATE、WRITETEXT、UPDATETEXT。相關內容
一個有趣的應用我們看到許多注冊系統在注冊後都不能更改用戶名,但這多半是由應用程序決定的, 如果直接打開數據庫表進行更改,同樣可以更改其用戶名,
在觸發器中利用回滾就可以巧妙地實現無法更改用戶名……詳細內容 觸發器內部語句出錯時……
這種情況下,前面對數據更改操作將會無效。舉個例子,在表中插入數據時觸發觸發器,而觸發器內部此時發生了運行時錯誤,那麼將返回一個錯誤值,並且拒絕剛才的數據插入。不能在觸發器中使用的語句
觸發器中可以使用大多數 T-SQL 語句,但如下一些語句是不能在觸發器中使用的。
CREATE 語句,如:CREATE DATABASE、CREATE TABLE、CREATE INDEX 等。
ALTER 語句,如:ALTER DATABASE、ALTER TABLE、ALTER INDEX 等。
DROP 語句,如:DROP DATABASE、DROP TABLE、DROP INDEX 等。
DISK 語句,如:DISK INIT、DISK RESIZE。
LOAD 語句,如:LOAD DATABASE、LOAD LOG。
RESTORE 語句,如:RESTORE DATABASE、RESTORE LOG。
RECONFIGURE
TRUNCATE TABLE 語句在sybase的觸發器中不可使用!
慎用觸發器
觸發器功能強大,輕松可靠地實現許多復雜的功能,為什麼又要慎用呢。觸發器本身沒有過錯,但由於我們的濫用會造成數據庫及應用程序的維護困難。在數據庫操作中,我們可以通過關系、觸發器、存儲過程、應用程序等來實現數據操作……
同時規則、約束、缺省值也是保證數據完整性的重要保障。如果我們對觸發器過分的依賴,勢必影響數據庫的結構,同時增加了維護的復雜程序.