1. 程式人生 > >儲存過程與觸發器的簡單學習

儲存過程與觸發器的簡單學習

為什麼需要儲存過程?

在沒有使用儲存過程的資料庫應用程式中,使用者所編寫的應用程式都是從本地計算機(client)向伺服器(server)端傳送SQL程式碼來請求對資料庫中資料的增刪改差操作,伺服器對接收到的SQL程式碼進行編譯後執行,並將結果返回給client,再由客戶端的軟體處理後輸出。如果開發者對伺服器安全性考慮不周全,就會為黑客提供盜取資料的機會。其中SQL注入是一種常見的方式。為了防止SQL注入過程洩露企業的商業機密,我們可以通過儲存過程把對資料庫操作的SQL程式碼預先編譯好並儲存在伺服器端。這樣既減少了網路傳輸量,又能保證應用程式的執行效能。
這段話來自於

https://www.cnblogs.com/weilengdeyu/archive/2012/12/26/2834625.html

什麼是儲存過程?

儲存過程(procedure)類似於C#語言中的方法,它是SQL語句和控制語句的預編譯集合。儲存過程儲存在資料庫裡,可由應用程式呼叫執行。說的簡單一點,儲存過程就像資料庫中執行的方法
這段話來自於 https://www.cnblogs.com/weilengdeyu/archive/2012/12/26/2834625.html

儲存過程分類

  1. 系統儲存過程:伺服器已存在的儲存過程,名稱一般以SP_開頭
  2. 使用者儲存過程:使用者可以自定義儲存過程,例如
    //無引數的儲存過程
    create procedure user_insert //user_insert是儲存過程名稱
    as
    begin
    	insert into user(id, username, password) 
    	values(1, 'me', '123')
    end
    
    //有引數的儲存過程
    //注意:procedure可以簡寫為proc
    create proc user_insert //user_insert是儲存過程名稱
    @username varchar(10),@password varchar(20) //引數
    as
    begin
    	insert into user(id, username, password) 
    	values(1, @username, @password)
    end
    

那麼如何執行儲存過程呢?

exec 儲存過程名 [引數]
例如 exec user_insert ‘me’, ‘123’

什麼是觸發器?

  • 觸發器是一種特殊型別的儲存過程。一般的儲存過程名稱被直接呼叫,而觸發器主要是通過事件觸發而被執行
  • 觸發器作用在表上,當表中資料發生變化時(insert、update、delete)自動強制執行。
  • 當執行新增操作時,會生成臨時表inserted,存放新增的資料
  • 當執行刪除操作時,會生產臨時表deleted,存放刪除的資料
  • 當執行修改操作時,會同時產生2個臨時表,一個是inserted,存放的是新的資料,一個是deleted,存的是舊的資料

觸發器的建立

create trigger user_trigger //user_trigger是觸發器名稱
on user //作用在user表上
for insert //觸發事件是當user表插入資料,for表示的是當插入完成時才執行觸發器,也可用after代替
as //觸發器程式碼
begin
	select * into new_insert_user from inserted //把新插入的資料備份到new_insert_user表,在備份前new_insert_user表必須不存在
end

注意:

  1. 跟for(after)相似的用法還有instead of,instead of代表的是作用的那張表的資料變化的SQL語句不會執行,只會執行觸發器的程式碼
  2. 觸發事件可以寫多個,例如for insert | update | delete,但是一般單獨寫一個
  3. inserted、deleted臨時表只能用在觸發器程式碼中