固然使用具名參數可以減低SQL Injection(SQL 隱碼)的風險,但要加強存取資料庫時的安全性,可以改用預存程序存取資料。
雖然微軟官方網站建立預存程序已經說明了如何使用SQL SERVER的預存程序,但SQL SERVER和MySQL的預存程序語法有些微差異,容易造成混淆,因此筆者將兩種資料庫預存程序列出語法作比較。
SQL SERVER版本:
//指定使用bookstore資料庫
USE bookstore;
USE bookstore;
GO
//建立select_books預存程序
CREATE PROCEDURE select_books
//定義傳入的具名參數名稱與資料型別,SQL SERVER以@辨別具名參數
@booksname varchar(50),
@booksprice int(10)
//SQL SERVER以AS開始下SQL指令,以GO做結尾不需加分號(;)
AS
//下SQL指令
SELECT booksname, booksprice
FROM books
WHERE booksname = @booksname AND booksprice = @booksprice
GOMySQL版本:
//MySQL預存程序建立在各資料庫內,因此無須宣告將使用的資料庫
//由root登入localhost建立select_books預存程序(MySQl為TCP/IP登入驗證)
CREATE DEFINER=`root`@`localhost` PROCEDURE `select_books`
//定義傳入具名參數名稱的具名參數資料型別並用()區隔,
//MySQL具名參數中不可使用@,?等特殊符號,筆者使用相近的字詞作為具名參數名稱
(
p_booksname varchar(50),
//MySQL具名參數中不可使用@,?等特殊符號,筆者使用相近的字詞作為具名參數名稱
(
p_booksname varchar(50),
p_booksprice int(10)
)
//MySQL以BEGIN開始下SQL指令,以END作結尾需加分號(;)
BEGIN
BEGIN
//下SQL指令
SELECT booksname, booksprice
FROM books
WHERE booksname = p_booksname AND booksprice = p_booksprice;
END
從上面兩個範例看得出來,語法其實大同小異,但是差異頗多,在使用上要多加注意,不要用錯