日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

【SQL】存储过程procedure 触发器trigger

發(fā)布時(shí)間:2023/12/20 数据库 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【SQL】存储过程procedure 触发器trigger 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

關(guān)于存儲(chǔ)過(guò)程和觸發(fā)器,雖然之前聽(tīng)過(guò)它們,但一直都沒(méi)有怎么實(shí)踐過(guò)。最近在項(xiàng)目過(guò)程中使用到了存儲(chǔ)過(guò)程和觸發(fā)器,趁熱打鐵,把它們總結(jié)一下。希望對(duì)您有所幫助。

procedure:
what?
? ? 一般在大型數(shù)據(jù)庫(kù)中,一組為了完成特定功能的SQL語(yǔ)句集,存儲(chǔ)在數(shù)據(jù)庫(kù)中,經(jīng)過(guò)第一次編譯過(guò)后,再次調(diào)用不需要再次編譯,用戶只需要指定存儲(chǔ)過(guò)程名字并給定拿書(shū)就可以執(zhí)行完成任務(wù)。
? ? 存儲(chǔ)過(guò)程屬于數(shù)據(jù)庫(kù),不屬于表。存儲(chǔ)過(guò)程就像數(shù)據(jù)庫(kù)中運(yùn)行方法(函數(shù))一樣;和C#里的方法一樣,由存儲(chǔ)過(guò)程名、存儲(chǔ)過(guò)程參數(shù)組成,可以有返回結(jié)果。前面學(xué)習(xí)的if else/while/變量/insert/select等,都可以在存儲(chǔ)過(guò)程中使用。

advantage
? ? No1、執(zhí)行速度快。在數(shù)據(jù)庫(kù)中保存的存儲(chǔ)過(guò)程語(yǔ)句都是編譯過(guò)的。
? ? No2、允許模塊化程序設(shè)計(jì)。類似方法的調(diào)用。
? ? No3、提高系統(tǒng)安全性。防止SQL注入(與帶參數(shù)的SQL語(yǔ)句一樣可以防止SQL語(yǔ)句注入攻擊,帶參數(shù)的SQL語(yǔ)句其實(shí)是調(diào)用了sp_executesql存儲(chǔ)過(guò)程。)
? ? No4、減少網(wǎng)絡(luò)流量。只要傳輸存儲(chǔ)過(guò)程的名稱即可。
? ? No5、最主要的是執(zhí)行效率和SQL代碼的封裝。特別是SQL代碼封裝功能,如果沒(méi)有存儲(chǔ)過(guò)程,在外部程序訪問(wèn)數(shù)據(jù)庫(kù)時(shí),要組織很多SQL語(yǔ)句。特別是業(yè)務(wù)邏輯復(fù)雜的時(shí)候,一大堆的SQL語(yǔ)句和條件夾雜在程序設(shè)計(jì)代碼中,讓人不寒而栗。有了存儲(chǔ)過(guò)程,業(yè)務(wù)邏輯可以封裝在存儲(chǔ)過(guò)程中,這樣不僅易維護(hù),而且執(zhí)行效率高。

classification
?? 系統(tǒng)存儲(chǔ)過(guò)程:由系統(tǒng)定義,存放在master數(shù)據(jù)庫(kù)中。名稱以sp_ 或xp_開(kāi)頭,自定義的存儲(chǔ)過(guò)程可以以u(píng)sp_開(kāi)頭.
?? 自定義存儲(chǔ)過(guò)程:由用戶在自己的數(shù)據(jù)庫(kù)中創(chuàng)建的存儲(chǔ)過(guò)程

create grammar
create procedure 存儲(chǔ)過(guò)程名(參數(shù)) @參數(shù) 數(shù)據(jù)類型=默認(rèn)值 output 【參數(shù)說(shuō)明:參數(shù)可選,參數(shù)可分為輸入?yún)?shù)、輸出參數(shù),輸入?yún)?shù)允許有默認(rèn)值】
as
begin
? ? sql 語(yǔ)句.....(可有多個(gè))
end;


transfer grammar

exec/call(具體數(shù)據(jù)庫(kù)執(zhí)行調(diào)用時(shí)的關(guān)鍵字) 存儲(chǔ)過(guò)程名(實(shí)參)(帶參數(shù)的存儲(chǔ)過(guò)程)

注:
參數(shù)的分類:in(表示存儲(chǔ)過(guò)程需要給它一個(gè)值,是默認(rèn)的狀態(tài)) out(表示存儲(chǔ)過(guò)程會(huì)返回一個(gè)值) inout(既可以傳值進(jìn)去 也可以帶值出來(lái))。存儲(chǔ)過(guò)程limit后面不能使用參數(shù)。調(diào)用out存儲(chǔ)過(guò)程前,需要先定義一個(gè)變量:set @(不同編程語(yǔ)言中 不一定都是@)變量類名=值。

delete grammar
drop 存儲(chǔ)過(guò)程名(if exists)
pay attention to
? ? 存儲(chǔ)過(guò)程只是先編譯SQL語(yǔ)句,所以當(dāng)SQL語(yǔ)句中有錯(cuò)誤的表或?qū)傩詴r(shí),系統(tǒng)不會(huì)提示,而且存儲(chǔ)過(guò)程會(huì)創(chuàng)建成功,只有當(dāng)調(diào)用執(zhí)行時(shí)才提示錯(cuò)誤。 設(shè)置SQL server(使用的具體數(shù)據(jù)庫(kù))控制臺(tái)的結(jié)尾符號(hào)。默認(rèn)的以;結(jié)尾,我們可以自己設(shè)置結(jié)束符號(hào)。關(guān)鍵字 結(jié)束符(例如mysql:delimiter // 表示以//作為結(jié)束符號(hào)。)因?yàn)镾QL語(yǔ)句在執(zhí)行到首個(gè)以;結(jié)尾時(shí)就會(huì)認(rèn)為SQL語(yǔ)句結(jié)束了。
Example
在可編程性里創(chuàng)建所需的存儲(chǔ)過(guò)程:


trigger:
what?
? ? [1]在SQL server里面也就是對(duì)某一個(gè)表的一定操作,觸發(fā)某種條件,從而執(zhí)行的一段程序。
? ? [2]觸發(fā)器是一個(gè)特殊的存儲(chǔ)過(guò)程。觸發(fā)器是一種特殊類型的存儲(chǔ)過(guò)程,它不同于前面的一般的存儲(chǔ)過(guò)程。【在SQL內(nèi)部把觸發(fā)器看做是存儲(chǔ)過(guò)程,但是不能傳遞參數(shù)】
? ? [3]一般的存儲(chǔ)過(guò)程通過(guò)存儲(chǔ)過(guò)程名稱被直接調(diào)用,而觸發(fā)器主要是通過(guò)事件進(jìn)行觸發(fā)而被執(zhí)行。
? ? [4]觸發(fā)器是一個(gè)功能強(qiáng)大的工具,在表中數(shù)據(jù)發(fā)生變化時(shí)自動(dòng)強(qiáng)制執(zhí)行。觸發(fā)器可以用SQL server約束、默認(rèn)值和規(guī)則的完整性檢查,還可以完成難以用普通約束實(shí)現(xiàn)的復(fù)雜功能。

effect
? ? 自動(dòng)化操作,減少了手動(dòng)操作以及出錯(cuò)幾率。
classification
? ? No1、DML觸發(fā)器:A.Insert 、delete 、update(不支持select); B.after觸發(fā)器(for)、 instead of觸發(fā)器(不支持before觸發(fā)器)
? ? No2、DDL觸發(fā)器:create table 、 create database、alter、drop...

pay attention to
? ? 觸發(fā)器只有表觸發(fā)器,沒(méi)有行觸發(fā)器。例如刪除一個(gè)含有10行數(shù)據(jù)的表,將其添加到新表中,只執(zhí)行一次觸發(fā)器。
Example

在所需表(類別表)下面創(chuàng)建trigger:

執(zhí)行刪除sql語(yǔ)句:

總結(jié)

以上是生活随笔為你收集整理的【SQL】存储过程procedure 触发器trigger的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。