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




















