使用MySQL時,只要撰寫程式的內容符合UDF架構的規範,即可撰寫自定義的函數來提升MySQL的功能。本文將介紹如何安裝此類UDF程式庫來擴充MySQL資料庫的功能。
安裝lib_mysqludf_json程式庫
在前幾期中,筆者曾經介紹過一個MySQL資料庫的稽核軟體mysql-audit,該軟體可將MySQL的相關資料庫的存取動作,以JSON的資料格式寫入至檔案中,以供日後稽核管理之用,接著簡單說明JSON資料格式的相關背景知識。
JSON(JavaScript Object Notation)是一種輕量級的資料交換語言,利用純文字為基底來描述並儲存及傳送簡單結構資料。JSON可以透過特定的格式來儲存任何型態的資訊,例如字串或數字或陣列,甚至複雜結構的物件,並利用此格式來傳送較複雜的資料。由於JSON只是一種純文字格式的結構描述語言,因此可以非常簡單地與其他的程式溝通或交換資料。
JSON字串可以包含「陣列」(Array)資料或是「物件」(Object)資料。「陣列」以[]符號表示,而「物件」,以{}符號表示,其中物件資訊可利用KEY:VALUE來表示資訊。例如"db":"childen",其中"db"即為KEY值,而"childen"即為VALUE值。
透過mysql-audit稽核軟體所產生的JSON範例如下:
lib_mysqludf_json程式庫即是用來建立JSON格式的資訊。以下介紹如何安裝lib_mysqludf_json程式庫。
首先,下載lib_mysqludf_ json相關原始碼。連結至網址「https://github.com/mysqludf/lib_mysqludf_
json/archive/master.zip」取得相關原始碼,下載其中壓縮成zip格式的壓縮檔,檔案名稱為master.zip。再以「unzip master」指令解壓縮原始碼。
隨後輸入指令「gcc -Wall -I/usr/local/mysql5/include -I. -shared lib_mysqludf_json.c -o lib_mysqludf_json.so」編譯lib_mysqludf_json程式庫,其中「/usr/local/mysql5/include」為筆者所安裝的MySQL目錄,此目錄名稱需視讀者的系統環境而定。
接著執行指令「cp lib_mysqludf_json.so /usr/local/mysql5/lib/plugin/」。在安裝成功後,就會產生一個lib_mysqludf_json.so檔案,將此檔案複製到MySQL的plugin目錄中,這裡的目錄名稱為「/usr/local/mysql5/lib/plugin/」。
然後透過相關指令「mysql -u root -p [資料庫密碼]」登入至MySQL資料庫的管理介面中。接下來有包含mysql>字樣的指令,即表示在MySQL的管理介面中所執行的SQL指令。
執行「mysql >DROP FUNCTION IF EXISTS lib_mysqludf_json_info;」,假如lib_mysqludf_json_info函數存在,即刪除該函數。再執行指令「mysql >DROP FUNCTION IF EXISTS json_array;」,如果json_array函數存在,就會被刪除。
緊接著,依序執行指令「mysql >DROP FUNCTION IF EXISTS json_members;」及「mysql >DROP FUNCTION IF EXISTS json_object;」,假如json_members和json_object函數存在,就會被刪除掉,如圖5所示。
|
▲圖5 刪除相關的函數。 |
然後透過指令「mysql >create function lib_mysqludf_json_info returns string soname 'lib_mysqludf_json.so';」建立lib_mysqludf_json_info函數,該函數功能在於回傳lib_mysqludf_json的版本資訊。例如執行「select lib_mysqludf_json_info()」,就會回傳lib_mysqludf_json的版本資訊。
輸入指令「mysql >create function json_array returns string soname 'lib_mysqludf_json.so';」建立json_array函數,該函數的用途在於產生一個陣列型態的JSON資訊,例如「SELECT json_array("id","type","title","source") AS jsonarray」可產生如["id","type","title","source"]的JSON陣列格式。
而指令「mysql >create function json_members returns string soname 'lib_mysqludf_json.so';」可用來建立json_members函數,該函數的用途在於產生key:value型態的資訊,例如「SELECT json_members('key','value')」可產生key:value的回傳值。
最後使用指令「mysql >create function json_object returns string soname 'lib_mysqludf_json.so';」建立json_object函數,該函數的用途在於產生一組{key:value}資訊。
如下即為產生資料庫表格(名稱為member)的JSON資訊。執行「Select json_object(name AS 'name', email AS 'email') FROM member」可產生{"name":"xxx","email":"xxx@xxx"}資訊,如圖6所示。
|
▲圖6 新建相關的函數。 |
lib_mysqludf_json程式庫主要是運用在產生JSON格式的相關資訊,而接下來介紹的mysql_json則用來取得JSON格式的資訊。
接著說明如何安裝lib_mysqludf_json程式庫。先下載mysql_json相關原始碼,連結至網址「https://github.com/kazuho/mysql_json/archive/master.zip」取得相關原始碼。將master.zip檔案下載回來後,以unzip解壓縮。接著執行指令「gcc -Wall -I/usr/local/mysql5/include -I. -shared mysql_json.cc -o lib_mysql_json.so」。
筆者發現所下載的mysql_json原始檔,其中的picojson目錄為空(或許是作者忘了加進去),如果讀者下載的檔案也有相同的情況,可先以指令「git clone git://github.com/kazuho/picojson.git」將picojson完整複製回來,再將此目錄搬移到mysql_json原始檔目錄內,即可編譯mysql_json。
編譯成功後,執行指令「cp lib_mysql_json.so /usr/local/mysql55/lib/plugin/」將此程式庫複製到MySQL的plugin目錄內。
然後利用相關指令「mysql -u root -p [資料庫密碼]」登入至MySQL資料庫的管理介面。隨後使用指令「Create function json_get returns string soname 'lib_mysql_json.so';」建立json_get函數,該函數的用途在取得JSON格式中的相關資訊。以mysql-aduit所產生的資料為例,「SELECT json_get('json資料來源','user')」指令即為取得KEY值等於user的資訊。
結語
一般程式設計師在開發設計資料庫應用系統時,總是習慣以程式邏輯的方式來完成所有的功能,而MySQL資料庫的UDF架構允許第三方程式設計師針對資料庫設計功能來擴充相關資料庫的功能,如此即可將部分原本應由程式邏輯完成的功能,改用資料庫邏輯來完成,而不必撰寫冗長的程式碼。
<吳惠麟,多年資安經驗,喜好利用開源碼建構相關解決方案。現任職於台灣學術網路危機處理中心(TACERT)。著有「資訊安全原理與實驗」。TACERT官方網址:http://cert.tanet.edu.tw/>