什么是存儲(chǔ)過程 |
存儲(chǔ)過程是SQL語(yǔ)句和控制語(yǔ)句的預(yù)編譯集合,保存在數(shù)據(jù)庫(kù)里,可由應(yīng)用程序調(diào)用執(zhí)行,而且允許用戶聲明變量、邏輯控制語(yǔ)句及其他強(qiáng)大的編程功能。存儲(chǔ)過程可以接受輸入?yún)?shù),并可具有輸出參數(shù),還可以返回單個(gè)或多個(gè)結(jié)果集。
_ | 存儲(chǔ)過程的優(yōu)點(diǎn) |
1)允許模塊化程序設(shè)計(jì)
只需創(chuàng)建一次存儲(chǔ)過程并將其存儲(chǔ)在數(shù)據(jù)庫(kù)中,以后就可以在應(yīng)用程序中任意調(diào)用該存儲(chǔ)過程。存儲(chǔ)過程可由在數(shù)據(jù)庫(kù)編程方面有專長(zhǎng)的人員創(chuàng)建,并可獨(dú)立于程序代碼而單獨(dú)修改。
2)改善性能
如果某操作需要大量的SQL語(yǔ)句或需要重復(fù)執(zhí)行,則用存儲(chǔ)過程比每次直接執(zhí)行SQL語(yǔ)句的速度要快。因?yàn)閿?shù)據(jù)庫(kù)管理系統(tǒng)是在創(chuàng)建存儲(chǔ)過程時(shí)對(duì)SQL代碼進(jìn)行分析和優(yōu)化,并在第一次執(zhí)行時(shí)進(jìn)行語(yǔ)法檢查和編譯,將編譯好的可執(zhí)行代碼存儲(chǔ)在內(nèi)存的一個(gè)專門緩沖區(qū)中,以后再執(zhí)行此存儲(chǔ)過程時(shí),只需直接執(zhí)行內(nèi)存中的可執(zhí)行代碼即可。
3)減少網(wǎng)絡(luò)流量
一個(gè)需要數(shù)百行SQL代碼完成的操作現(xiàn)在只需要一條執(zhí)行存儲(chǔ)過程的代碼即可實(shí)現(xiàn),因此,不再需要在網(wǎng)絡(luò)中傳送大量的代碼。
4)可作為安全機(jī)制使用
對(duì)于即使沒有直接執(zhí)行存儲(chǔ)過程中的語(yǔ)句權(quán)限的用戶,也可以授予他們執(zhí)行該存儲(chǔ)過程的權(quán)限。
_ | 存儲(chǔ)過程語(yǔ)法示例 |
CREATE OR REPLACE
PROCEDURE name [ (parameter [,parameter,…] ) ] IS //或AS
[說明:變量定義于此]
BEGIN
執(zhí)行語(yǔ)句序列
[EXCEPTION
例外處理程序
END [name ];
用戶通過create or repalce語(yǔ)句可以建立存儲(chǔ)于服務(wù)器端的存儲(chǔ)過程。存儲(chǔ)過程不能用于sql語(yǔ)句。(Procedures cannot be used in SQLstatements;)
Procedure有0或多個(gè)參數(shù),參數(shù)可是(IN), output (OUT), (IN OUT)
類型.
執(zhí)行存儲(chǔ)過程
set serveroutputon
直接執(zhí)行:
execute my_testproc
exec my_testproc
存儲(chǔ)過程里要返回一個(gè)結(jié)果集,就必須要用到游標(biāo)。那么什么是游標(biāo)呢?簡(jiǎn)而言之,SQL語(yǔ)句返回的結(jié)果通常為數(shù)據(jù)集,而游標(biāo)可以在此基礎(chǔ)上,像一個(gè)指針一樣,對(duì)某些行結(jié)果進(jìn)行處理。
適用場(chǎng)景
1)某些場(chǎng)景下,針對(duì)SELECT返回的集合,需要進(jìn)行逐行讀取,或者針對(duì)行數(shù)據(jù)進(jìn)行某些操作。
2)在某些交互式程序中,集合不能作為有效的處理單元,這時(shí)候需要有針對(duì)的逐行或者部分進(jìn)行處理。
_ | 存儲(chǔ)過程審計(jì)的難點(diǎn) |
審計(jì)類產(chǎn)品是基于旁路流量鏡像進(jìn)行工作的,需要抓取網(wǎng)絡(luò)中數(shù)據(jù)庫(kù)的流量進(jìn)行解析還原,前面有講到存儲(chǔ)過程的優(yōu)點(diǎn)有一條是減少網(wǎng)絡(luò)流量,執(zhí)行存儲(chǔ)過程在網(wǎng)絡(luò)傳輸?shù)闹皇谴鎯?chǔ)過程的名稱和參數(shù),具體的存儲(chǔ)過程封裝的SQL內(nèi)容實(shí)際是在服務(wù)器本地執(zhí)行的,沒有相應(yīng)的流量,所以只能審計(jì)到執(zhí)行存儲(chǔ)過程的動(dòng)作,不能抓取到SQL,目前是業(yè)界難題。
_ | 復(fù)雜存儲(chǔ)過程審計(jì)能力實(shí)踐 |
昂楷某客戶的業(yè)務(wù)系統(tǒng)使用大量存儲(chǔ)過程語(yǔ)法,SQL翻譯效果不直觀,影響可讀性,昂楷迎難而上,攻克了針對(duì)存儲(chǔ)過程深度解析的難題,提取出存儲(chǔ)過程的參數(shù)和值,重點(diǎn)是從存儲(chǔ)過程中審計(jì)出藥品相關(guān)的值,并配合翻譯功能,展現(xiàn)可讀性較好的中文描述信息。
翻譯效果:用戶[李明X] IP為[192.168.100.32]計(jì)算機(jī)用戶名[Administrator] 上調(diào)用了[西藥庫(kù)藥品明細(xì)賬查詢]窗口, 查詢內(nèi)容是{藥房:西藥庫(kù);項(xiàng)目:注射用艾普拉唑鈉; 出入庫(kù)類型:采購(gòu)入庫(kù);至:
to_date(‘2022-05-01 00:00:00’,’yyyy/mm/dd hh24:mi:ss’),至:
to_date(‘2022-05-15 00:00:00’,’yyyy/mm/dd hh24:mi:ss’),}
昂楷審計(jì)產(chǎn)品(數(shù)據(jù)庫(kù)審計(jì)、防統(tǒng)方)能夠?qū)QL Server、Oracle、DB2、Sybase、MySQL 等數(shù)據(jù)庫(kù)進(jìn)行審計(jì),審計(jì)的行為包括DDL、DML、DCL以及其它操作等行為。
審計(jì)的內(nèi)容可以細(xì)化到庫(kù)、表、記錄、用戶、存儲(chǔ)過程、函數(shù)、游標(biāo)、調(diào)用參數(shù)等等。檢驗(yàn)一款數(shù)據(jù)庫(kù)審計(jì)產(chǎn)品的標(biāo)準(zhǔn),不僅要能滿足常規(guī)的SQL審計(jì),還要能滿足復(fù)雜SQL,如存儲(chǔ)過程、綁定變量、嵌套語(yǔ)句、函數(shù)、超長(zhǎng)語(yǔ)句、腳本的審計(jì),這樣才能做到真正的完整審計(jì)。




















