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




















