數據庫優化之建立存儲過程、觸發器

    存儲過程可加快查詢的執行速度,提升訪問數據的速度,幫助實現模塊化編程,保存一致性,提升安全性。觸發器是在對錶進行插入、更新、刪除操做時自動執行的存儲過程,一般用於強制業務規則。sql


1、存儲過程
shell

1. 爲何須要存儲過程數據庫

    從客戶端經過網絡向服務器發送SQL代碼並執行是不安全的,給***提供盜取數據的機會,以下圖所示,一個簡單的SQL注入過程編程

楊書凡38.png

   從上圖可知,應用程序的執行過程是不安全的,主要有如下幾個方面:
安全

(1)數據不安全,網絡傳送SQL代碼,容易被未受權者截獲bash

(2)每次提交SQL代碼都要通過語法編譯後在執行,影響應用程序的運行性能服務器

(3)網絡流量大,對於反覆執行的SQL代碼,在網絡上屢次傳送,影響網絡傳輸量網絡


2. 什麼是存儲過程編程語言

    存儲過程是SQL語句和控制語句的預編譯集合,保存在數據庫中,可有應用程序調用執行,並且容許用戶聲明變量、邏輯控制語句及其餘強大的編程功能。包含邏輯控制語句和數據操做語句,能夠接收參數、輸出參數、返回單個或多個結果值及返回值ide

    使用存儲過程的優勢:

(1)模塊化程序設計,只需建立一次,之後便可調用該存儲過程任意次

(2)執行速度快,效率高

(3)減小網絡流量

(4)具備良好的安全性

    存儲過程分爲系統存儲過程和用戶自定義的存儲過程


3. 系統存儲過程

    是一組預編譯的T-SQL語句,提供了管理數據庫和更新表的機制,並充當從系統表中檢索信息的快捷方式

(1)常見的系統存儲過程

    系統存儲過程的名稱以「sp_」開頭,存放在Resource數據庫中

楊書凡39.png

   

    使用存儲過程的語法以下:

exec  存儲過程名  [參數值]


例如:執行如下T-SQL語句

楊書凡40.png


(2)經常使用的擴展存儲過程

    擴展存儲過程是SQL Server提供的各種系統存儲過程的一類,容許使用其餘編程語言(如C#)建立外部存儲過程,一般以「xp_」開頭,以DDL形式單獨存在

    一個經常使用的擴展存儲過程爲xp_cmdshell ,它能夠完成DOS命令下的一些操做,如建立文件夾、列出文件夾。語法以下:

exec  xp_cmdshell  DOS命令  [no_output]

其中,no_output爲可選參數,設置執行DOS命令後是否輸出返回信息

例如:在C盤下建立一個文件夾bank,並查看文件

楊書凡41.png


4. 用戶自定義的存儲過程

    除了使用系統的存儲過程外,也能夠建立本身的存儲過程。可使用SSMS或T-SQL語句建立存儲過程

(1)使用SSMS建立存儲過程

楊書凡42.png


(2)使用T-SQL語句建立存儲過程

    建立存儲過程的語法以下:

楊書凡43.png

    刪除存儲過程的語法以下:

drop  proc  存儲過程名


案例:有如下兩個表,編寫存儲過程,實現網絡管理專業的平均分

楊書凡44.png

楊書凡45.png  

  

觸發器

    觸發器是一種特殊的存儲過程,當表中數據發生更新時自動調用,以響應INSERT、UPDATE、DELETE語句

1. 什麼是觸發器

    觸發器是對錶進行插入、更新、刪除操做時自動執行的存儲過程,一般用於強制業務規則,能夠定義比用CHECK約束更爲複雜的約束。觸發器主要是經過事件觸發而被執行的,而存儲過程能夠經過存儲過程名稱而被直接使用。


2. 觸發器的分類

INSERT觸發器:當向表中插入數據時觸發

UPDATE觸發器:當更新表中某列或多列時觸發

DELETE觸發器:當刪除表中記錄是觸發


3. deleted表和inserted表

    每一個觸發器都有兩個特殊的邏輯表:刪除表和插入表。由系統管理,存儲在內存而不是數據庫中,所以,不容許用戶直接對其修改。它們只是臨時存放對錶中數據行的修改信息,當觸發器工做完成,它們也被刪除。

楊書凡46.png

4. 觸發器的做用

    主要做用是:實現由主鍵和外鍵所不能保證的複雜的參照完整性和數據的一致性,除此以外,還有如下幾種功能

(1)強化約束:實現比CHECK約束更爲複雜的約束

(2)跟蹤變化:偵測數據庫內的操做,從而不容許未經許可的更新和變化

(3)級聯運行:偵測數據庫內的操做,並自動級聯影響整個數據庫的各項內容


5. 建立觸發器

    建立觸發器可以使用SSMS或T-SQL語句

(1)使用SSMS建立觸發器

楊書凡47.png


(2)使用T-SQL語句建立觸發器

    使用T-SQL語句建立觸發器的語法以下:

create  trigger  觸發器名          //建立的觸發器名稱
on  表名                            //在其上執行觸發器的表或視圖名稱
[with  encryption]                 //可選,防止將觸發器做爲SQL Server複製的一部分發布
for  {[delete,insert,update]}         //關鍵字,至少指定一項,若是多項,由逗號分隔
as sql語句


案例:建立一個觸發器,當有人更改信息時,提示一條消息,並阻止操做

楊書凡48.png


    若是須要修改觸發器,操做方法以下,在彈出的窗口修改T-SQL語句便可

楊書凡49.png


建立觸發器時注意事項

(1)create trigger必須是批處理中的第一條語句,並只能應用到一個表中

(2)觸發器只能在當前數據庫中建立,但能夠引用當前數據庫的外部對象

(3)在同一條create trigger語句中,能夠爲多種用戶操做(如DELETE)定義相同的觸發器操做

相關文章
相關標籤/搜索